【问题标题】:Eval MongoDB Query with NodeJS使用 NodeJS 评估 MongoDB 查询
【发布时间】:2016-01-05 05:09:06
【问题描述】:

我有一个 MongoDB 的查询接口,并通过 HTTP 请求从浏览器向 NodeJS 发送查询。 查询以字符串形式发送,可以是这样的:

var query = '{_id: ObjectId(\'536b07935c89be214c000009\'), "date": ISODate("2012-12-19T06:01:17.171Z"), mail: /test/i}'

我的问题,我怎样才能安全地评估这个字符串以便将它发送到 MongoDB NodeJS 客户端?

eval 不是一个选项(在 MongoDB 和 NodeJS 上),因为这是面向消费者的应用程序的一部分。

我对通过 HTTP 传递查询并在服务器上正确执行它们的其他安全解决方案持开放态度。

【问题讨论】:

  • 代码中query 的值是多少?它只是一个包含您在上面粘贴的值的字符串吗?您的代码究竟是如何失败的?错误信息是什么?您需要提供更多信息,以便人们为您提供帮助。
  • @mbaird 已修复,无法显示我尝试过的代码,因为它崩溃了,而且我与此解决方案无关
  • 您是否使用任何特定的 MongoDB API for Node,或者您不在乎使用哪一个?
  • @JohnZwinck 我目前正在使用官方的 mongodb 包,但我不在乎,只要我可以在前端编写标准查询并获得正确的结果。另外,我希望版本支持尽可能广泛

标签: node.js mongodb


【解决方案1】:

您呈现的字符串是一个 mongodb shell 查询。 该字符串包含 mongodb shell 特定的数据类型,因此只能在 mongodb shell 内部使用。 您无法在不同的 (javascript) 环境中解析或评估这些查询,因为它们不是有效的 JSON。因此,由于特定的数据类型,evalJSON.parse 甚至都不起作用。

如果您想序列化 mongodb 查询以在不同环境中使用,您可以使用 MongoDB Extended JSON。

https://docs.mongodb.org/v3.0/reference/mongodb-extended-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 驱动程序对象。

你可以使用这个库来做到这一点:
https://www.npmjs.com/package/mongodb-extended-json

您还可以在浏览器中使用此库来构建查询。或者您可以手动构建 mongodb 查询。

我不知道允许您将 mongodb shell 查询自动转换为 MongoDB 扩展 JSON 的插件/npm 包。您可以尝试通过实现您自己的一些类型(ISODate、ObjectId)来自动转换它们。但是,您永远不会在 mongodb shell 和 mongodb nodejs 驱动程序之间完全兼容,许多方法具有不同的签名和返回类型,游标的工作方式不同等等......

还有这个项目,官方支持的 mongodb nodejs 驱动程序的替代品,如果你真的重视它,它会尝试更多地模仿 shell,但它不会帮助你进行特定查询,你仍然会需要转换它。
https://docs.mongodb.org/ecosystem/drivers/node-js/

【讨论】:

  • 如何将标准 MongoDB 查询字符串转换为扩展 JSON?你能写一个例子吗?还是谢谢
  • @arkihillel 我更新了我的答案以解决您的评论,如果您还有任何问题,请告诉我。 (如果您对此感到满意,也请接受答案,以便我获得赏金:D)
  • @willem-dhaeseleer 好吧,我想我的问题应该更具体一些。我希望用户连接到他们的数据库,编写常用的 mongodb shell 查询。然后通过 HTTP 请求传递它们(或扩展 JSON 中的等价物)并在服务器上执行它们。您的解决方案强制用户以扩展的 JSON 方式编写查询。如果我想做的事情在技术上不可行,我很可能会接受它
  • @arkihillel 我认为让您的用户在扩展的 mongodb json 中编写查询可能是这里最简单的事情,它有据可查且易于阅读,它还允许您将查询发送到 python以过程为例。如果要支持 mongodb shell 查询,则必须实现 mongodb shell 数据类型,然后解析 javascript 并为 node.js 驱动程序构建适当的查询。
  • @willem-dhaeseleer 这基本上就是我现在所做的,但解析正则表达式(几乎?)是不可能的。关闭赏金。您可能想移动上面的can not convert 部分,以便将来的读者更直接
猜你喜欢
  • 2018-09-09
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多