我正试图在数据库中基于三个字段中的任何一个来查找用户。在邮差我有以下路径
http://localhost:8082/api/users/617473029f80eda3643a7fdd
http://localhost:8082/api/users/Michael
http://localhost:8082/api/users/25
目前在我的数据库中,我有不同用户的所有这些值。因此,其思想是path1返回具有该id的用户,path2返回具有该名称的用户,而path3返回具有该年龄的用户。fyi:我正在测试这个,所以到目前为止,这些字段值是唯一的,并且在数据库字段中没有重复。
对于下面的代码,唯一返回的是当我传入id时,但整个数据库都返回了。当我通过姓名或年龄时,没有任何回报
router.get('/:id', (req, res) => {
User.find( { $or: [
{"_id": req.params.id},
{"name": req.params.name},
{"age": req.params.age}
]})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
});
谢谢!
编辑:以下对我有效
router.get('/:id', (req, res) => {
User.find({$or: [
{name: req.params.id},
{age: req.params.id}
]})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '*** No User Found ***'}));
});
唯一的问题是它并没有捕捉到错误,所以当在poster中测试时,我发送的任何不匹配的东西都会返回一个空数组,而不是err。不确定这将如何影响程序本身,或者是否正常
req.params.name
或req.params.age
将未定义,因为路由参数为req.params.id
。要使其正常工作,您必须仅通过此路由参数查找值。字段名称会更改,但值-req.params.id
保持不变。
User.find( { $or: [
{"_id": req.params.id},
{"name": req.params.id},
{"age": req.params.id}
]})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
可选:为了将来使用,将id
重命名为slug
将是一个更好的选择,因为这与架构中的所有其他字段都很好。
这就是mongodb在传递undefined/null
时返回结果的方式,它将其视为find({})
。
您需要检查name
/age
是否存在。我很确定这条路线不会使用名称/年龄,而是只使用_id
,所以你为什么不只通过_id
呢;
router.get('/:id', (req, res) => {
// check what is available in req.params - name/age/id
// based on it create query and run it
User.find({"_id": req.params.id})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
});
你应该检查这个链接。
您不能为每个请求参数设置不同的名称,因此req.params.id
必须只是一个id,不能通过名称req.params.name
使用
尝试通过查询参数发送请求,可能会更容易。我会保留:id
端点,这只是一种通过id请求一个用户的常见方式,并为所有其他请求创建另一个端点。
原因是您已将'/:id'
指定为端点。因此,这会起作用,但其他的不会起作用。为了解决这个问题,您需要为每个请求创建单独的路由,而不是将它们组合在一个路由中。
router.get('/:id', (req, res) => {
User.find({"_id": req.params.id})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
});
router.get('/name', (req, res) => {
User.find({"name": req.params.name})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
});
router.get('/age', (req, res) => {
User.find({"age": req.params.age})
.then(user => res.json(user))
.catch(err => res.status(404).json({nouserfound: '***NoUserFound***'}))
});