2017-04-18 69 views
0

我将一个web服务器从python移植到node.js,服务器必须具备的一项功能是接收包含有关MongoDB查询的信息的POST,并将结果查询到网页。该查询可能包含或不包含过滤器,投影,限制和排序。在蟒蛇,我们可以像这样做:如何在NodeJS中处理自定义MongoDB查询

(在下面COMMAND_NAME的例子等于“找到”)

command = getattr(collection, command_name) 

cmd_filter = loads(filter_str) if filter_str else None 
projection = loads(projection_str) if projection_str else None 
limit = loads(limit_str) if limit_str else 0 
sort = [(elt['key'], elt['order']) for elt in loads(sort_str)] if sort_str else None 

response = command(filter=cmd_filter, projection=projection, sort=sort, limit=limit) 

但我无法找到一种方法做它的node.js,我已经尝试过这样的东西:

command_name = req.body['command'] 
command = collection[command_name] 

command = filter_str != undefined ? collection[command_name](JSON.parse(filter_str)) : collection[command_name] 
command = projection_str != undefined ? command['project'](JSON.parse(projection_str)) : command 
command = sort_str != undefined ? command['sort'](JSON.parse(sort_str)) : command 
command = limit_str != undefined ? command['limit'](JSON.parse(limit_str)) : command 

response = command.toArray(function(err, result) { 
    if (err) throw err 

    console.log(result) 
}) 

但它不起作用。我得到一个MongoError: Can't canonicalize query: BadValue bad order array [2]

回答

2

你的代码不工作是你的问题最少的地方。我不知道你是否意识到,但用户可以使用你的API在数据库上执行任何命令。我不知道是否有这样一个名字,但你有Mongo注入漏洞。我从来没有见过类似的东西,在实时数据库上用随机数据显式运行用户提供的随机方法。

在Node中搜索对于REST API的Mongoose分页,排序等,您将发现很多关于如何正确执行此操作的信息。

有一些模块,可以帮你:

+1

谢谢您的回答。我忘了在帖子中提到这是该公司的内部申请。如果有人恶意使用这个应用程序,我们可以很容易地找到它们,或者我们遇到的问题比有人搞乱这个数据库。 –