首页 > 解决方案 > 在 mongoDB 中插入时如何转义 $

问题描述

我有一个我无法控制的大对象,字段可能会有很大差异:

错误 ==>> { MongoError: 'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0.$' 中的美元 ($) 前缀字段 '$'对存储无效。0|lt-检查 | 在 Function.MongoError.create (/home/ops/lt-checkin-api/node_modules/mongodb-core/lib/error.js:31:11) 0|lt-check | 在/home/ops/lt-checkin-api/node_modules/mongodb-core/lib/connection/pool.js:497:72 0|lt-check | 在 authenticateStragglers (/home/ops/lt-checkin-api/node_modules/mongodb-core/lib/connection/pool.js:443:16) 0|lt-check | 在 Connection.messageHandler (/home/ops/lt-checkin-api/node_modules/mongodb-core/lib/connection/pool.js:477:5) 0|lt-check | 在套接字。(/home/ops/lt-checkin-api/node_modules/mongodb-core/lib/connection/connection.js:333: 22) 0|lt-检查| 在 Socket.emit (events.js:159:13) 0|lt-check | 在 addChunk (_stream_readable.js:265:12) 0|lt-check | 在 readableAddChunk (_stream_readable.js:252:11) 0|lt-check | 在 Socket.Readable.push (_stream_readable.js:209:10) 0|lt-check | 在 TCP.onread (net.js:608:20) 0|lt-check | 名称:'MongoError', 0|lt-check | message: 'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0.$\' 中的美元 ($) 前缀字段 \'$\' 是对存储无效。', 0|lt-check | ok: 0, 0|lt-检查 | 10) 0|lt-检查| 在 TCP.onread (net.js:608:20) 0|lt-check | 名称:'MongoError', 0|lt-check | message: 'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0.$\' 中的美元 ($) 前缀字段 \'$\' 是对存储无效。', 0|lt-check | ok: 0, 0|lt-检查 | 10) 0|lt-检查| 在 TCP.onread (net.js:608:20) 0|lt-check | 名称:'MongoError', 0|lt-check | message: 'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0.$\' 中的美元 ($) 前缀字段 \'$\' 是对存储无效。', 0|lt-check | ok: 0, 0|lt-检查 |
errmsg: 'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0.$\' 中的美元 ($) 前缀字段 \'$\' 是对存储无效。', 0|lt-check | 代码: 52, 0|lt-检查 |
codeName: 'DollarPrefixedFieldName' }

这里是导致错误的关键:

"rawRequest": {
                        "ns2:LoadData": {
                            "$": {
                                "xmlns:ns2": "http://schemas.3gtms.com/tms/v1/tns"
                            },
                            "BatchInfo": [
                                {
                                    "$": {
                                        "xmlns": ""
                                    },

因为有多个以 $ 开头的键。

mongoose 或 mongoDB 本身是否有一个设置来插入任何内容而不验证传入的请求。

标签: node.jsmongodbmongoosekoa

解决方案


本来打算创建一个新插件,但@Anirudh 帮我在评论中找到了这个包

https://www.npmjs.com/package/mongo-escape

要使用它,就在您的插入查询转义之前,您使用上面的包来反对。

var escapeForMongo = require('mongo-escape').escape;
userInput = escapeForMongo({
  'foo': 'bar',
  'ba.z': {
    '$in': 'quz'
  }
})

推荐阅读