Node.js 使用NodeJS评估MongoDB查询
我有一个MongoDB的查询接口,我通过HTTP请求将查询从浏览器发送到NodeJS查询以字符串形式发送,可以是这样的:Node.js 使用NodeJS评估MongoDB查询,node.js,mongodb,Node.js,Mongodb,我有一个MongoDB的查询接口,我通过HTTP请求将查询从浏览器发送到NodeJS查询以字符串形式发送,可以是这样的: var query = '{_id: ObjectId(\'536b07935c89be214c000009\'), "date": ISODate("2012-12-19T06:01:17.171Z"), mail: /test/i}' 我的问题是,如何安全地评估此字符串,以便将其发送到MongoDB NodeJS客户端 eval不是选项(在MongoDB和NodeJS上
var query = '{_id: ObjectId(\'536b07935c89be214c000009\'), "date": ISODate("2012-12-19T06:01:17.171Z"), mail: /test/i}'
我的问题是,如何安全地评估此字符串,以便将其发送到MongoDB NodeJS客户端
eval
不是选项(在MongoDB和NodeJS上),因为这是面向消费者的应用程序的一部分
我对通过HTTP传递查询并在服务器上正确执行它们的其他安全解决方案持开放态度。您显示的字符串是mongodb shell查询。 该字符串包含特定于mongodb shell的数据类型,因此只能在mongodb shell中使用。 您不能在不同的(javascript)环境中解析或计算这些查询,因为它们不是有效的JSON。因此,由于特定的数据类型,
eval
或JSON.parse
甚至不起作用
如果您想序列化mongodb查询以便在不同环境中使用,可以使用mongodb扩展JSON
这是可以包含mongodb数据类型的标准JSON。
您的查询将在MongoDB扩展JSON中使用此选项
{
"_id": {
"$oid": "536b07935c89be214c000009"
},
"date": {
"$date": "2012-12-19T06:01:17.171Z"
},
"mail": {
"$regex": "test",
"$options": "i"
}
}
如果要解析或计算这样的字符串以将其传递给node.js mongodb驱动程序,则需要使用库将其反序列化为正确的node.js mongodb驱动程序对象
您可以使用此库执行此操作:您还可以在浏览器中使用此库来生成查询。或者您可以手工构建mongodb查询 我不知道plugin/npm包允许您自动将mongodb shell查询转换为mongodb扩展JSON。您可以尝试通过实现自己的一些类型(ISODate、ObjectId)来自动转换它们。但是,mongodb shell和mongodb nodejs驱动程序之间永远不会完全兼容,许多方法具有不同的签名和返回类型,游标的工作方式也不同,等等 还有一个项目,它是官方支持的mongodb nodejs驱动程序的替代品,如果您真的重视它,它会尝试更多地模仿shell,但它不会帮助您处理特定的查询,您仍然需要转换它。
代码中的
query
值是多少?它只是一个字符串,包含上面粘贴的值吗?你的代码到底是如何失败的?错误消息是什么?您需要提供更多信息,以便人们帮助您。@mbaird已修复,无法显示我尝试的代码,因为它崩溃了,而且我与此解决方案无关。您是否使用任何特定的MongoDB API作为节点,或者您不在乎使用哪一个?@JohnZwinck我目前正在使用官方的MongoDB包,但只要我能在前端编写标准查询并得到正确的结果,我就不在乎使用哪一个。另外,我希望版本支持尽可能广泛。如何将标准MongoDB查询字符串转换为扩展JSON?你能写一个例子吗?谢谢anyway@arkihillel我更新了我的答案以回应您的评论,如果您还有任何问题,请告诉我。(如果你满意的话,也请接受答案,这样我就可以得到赏金了:D)@willem dhaeseleer嗯,我想我应该在我的问题上说得更具体些。我希望用户连接到他们的数据库,编写常见的mongodb shell查询。然后通过HTTP请求传递它们(或类似于扩展JSON中的等价物),并在服务器上执行它们。您的解决方案强制用户以扩展的JSON方式编写查询。如果我想做的不是技术上的,我很可能会接受feasible@arkihillel我认为让您的用户在扩展mongodb json中编写查询可能是这里最容易做的事情,它有很好的文档记录和可读性,例如,它还允许您将查询发送到python进程。如果您想支持mongodb shell查询,您必须实现mongodb shell数据类型,然后解析javascript并为node.js驱动程序构建适当的查询。@willem dhaeseleer这基本上就是我现在所做的,但解析正则表达式(几乎?)是不可能的。结束悬赏。您可能希望移动上面的不能转换的部分,以便将来的读者更容易理解