插入mongoDB时如何转义$

时间:2019-05-06 05:34:18

标签: node.js mongodb mongoose koa

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

  

Error == >> {MongoError:美元($)前缀字段“ $”   'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0。$'   不适用于存储。 0 | lt-check |在   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-check |在Socket.emit(events.js:159:13)0 | lt-check |在   addChunk(_stream_visible.js:265:12)0 | lt-check |在   visibleAddChunk(_stream_visible.js:252:11)0 | lt-check |在   Socket.Readable.push(_stream_visible.js:209:10)0 | lt-check |在   TCP.onread(net.js:608:20)0 | lt-check |名称:“ MongoError”,   0 | lt-check |消息:“中的美元($)前缀字段\'$ \'   \'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0。$ \'   对存储无效。',0 | lt-check | ok:0、0 | lt-check |
  errmsg:“中的美元($)前缀字段\'$ \'   \'value.external.originalRequest.rawRequest.ns2:LoadData.Orders.0.Order.0.TotalThirdPartyCharge.0.CurrencyValue.0。$ \'   对存储无效。',0 | lt-check |代码:52、0 | lt-check |
  codeName:“ DollarPrefixedFieldName”}

这是导致错误的键:

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

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

在mongoose或mongoDB本身中是否存在设置以插入任何内容而不验证传入的请求。

2 个答案:

答案 0 :(得分:0)

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

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

要使用它,请在插入查询转义之前使用上述包对对象进行

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

答案 1 :(得分:0)

function escapeMongo(obj) {
    return JSON.parse(
        JSON.stringify(obj),
        function(p, v) {
            if ((p[0] === '$') || (p.includes('.'))) {
                this[p.replace(/\$/g, '\uFF04').replace(/\./g, '\uFF0E')] = v;
                return;
            }
            return v;
        }
    )
}

userInput = {
    'foo': 'bar',
    'ba.z': {
        '$in': 'quz'
    }
}
console.log(userInput)
console.log(escapeMongo(userInput))

您可以在创建对象之前使用JSON.parse处理JSON字符串。