通过params中传递的任何字段查找数据库用户



我正试图在数据库中基于三个字段中的任何一个来查找用户。在邮差我有以下路径

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.namereq.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***'}))
});

最新更新