Lud*_*sen 1 rest mongoose mongodb node.js express
我正在Express 4之上构建一个REST API.对于一个路径,GET /api/users我想要相应地向可选的 queryParams 查询我的用户集合.
因此,对API的调用可能如下所示 host:port/api/users?city=Berlin
在这种情况下name,省略并且不影响查询,而city必须匹配.
我设法通过以下hack来做到这一点.还有比这更好的方法吗?
Users.statics.customFilter = function(qP){
return this.find({
$and: [
{$or: [{undefined: {$eq: qP.city}}, {'city': qP.city}]},
{$or: [{undefined: {$eq: qP.name}}, {'name': qP.name}]}
]
});
mongoose.model('User', Users);
Run Code Online (Sandbox Code Playgroud)
我正在从像这样的猫鼬模式中调用这个静态函数...
const User = mongoose.model('User');
app.get('/api/users', (req, res) => {
User.customFilter(req.query)
.exec((err, results) => {
if (err) return next(err);
res.json(results);
});
});
Run Code Online (Sandbox Code Playgroud)
在我看来,从本质上讲,User.find(req.query)应该做你想做的事:
/api/users?city=Berlin ? User.find({ city : 'Berlin' })
/api/users?name=John ? User.find({ name : 'John' })
/api/users?name=John&city=Berlin ? User.find({ city : 'Berlin', name : 'John' })
Run Code Online (Sandbox Code Playgroud)
当然,如果没有传递参数,你必须决定会发生什么(在上面的例子中,它将成为一个匹配所有用户的查询,这可能不是你想要的).
此外,您应该过滤,req.query以便它只包含您的架构中定义的字段.
| 归档时间: |
|
| 查看次数: |
4605 次 |
| 最近记录: |