我在Express.js中编写REST API以从mongo数据库中检索一些记录。要获取一组记录,我使用标准的GET请求:
GET localhost:3000/api/books
现在要实现我使用express-api-queryhandler
的过滤器。代码如下所示:
routes.use(queryHandler.filter());
[...]
.get((req: any, res: Response) => {
Book.find(req.where, req.fields, req.options, (err: any, orders: any) => {
res.status(200).json(books);
});
});
所以现在当我想要检索一个特定元素时,我可以写出:。
GET localhost:3000/api/books?name=Harry%20Potter
但实施(大于/小于)GT,GTE,LT,LTE功能的最佳方式是什么? Node.js有什么好的库吗?我只在Loopback
文档中找到了where函数,但是可以在Express中使用Loopback吗?
我可以手动编写所有内容,但这不是一个好的解决方案。提前谢谢。
编辑: 我在前面提到的包中编辑了filter.js文件,以便它可以与gt,lt,gte,lte一起使用。它看起来很安全,但也许有更好的选项可以进行更多验证?
function filter (query, skip) {
var filters = {};
var k;
var SKIP_KEYS = [
'fields',
'limit',
'offset',
'sort'
].concat(skip);
for (k in query) {
if (SKIP_KEYS.indexOf(k) === -1) {
var param = query[k];
// Added part
if(param.startsWith("gte_")) param = {"$gte": param.substr(4)}
else if(param.startsWith("lte_")) param = {"$lte": param.substr(4)}
else if(param.startsWith("gt_")) param = {"$gt": param.substr(3)}
else if(param.startsWith("lt_")) param = {"$lt": param.substr(3)}
// End of added part
console.log(param);
filters[k] = param;
}
}
return filters;
}
module.exports = function (options) {
var o = options || {};
return function (req, res, next) {
req.where = filter(req.query, o.skip);
next();
};
};