node.js - 在 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 本身是否有一个设置来插入任何内容而不验证传入的请求。
解决方案
本来打算创建一个新插件,但@Anirudh 帮我在评论中找到了这个包
https://www.npmjs.com/package/mongo-escape
要使用它,就在您的插入查询转义之前,您使用上面的包来反对。
var escapeForMongo = require('mongo-escape').escape;
userInput = escapeForMongo({
'foo': 'bar',
'ba.z': {
'$in': 'quz'
}
})
推荐阅读
- php - 我如何解决 Laravel 中间件返回类 stdClass 的对象无法转换为字符串错误
- c# - 从 C# Write-Verbose 运行 PowerShell 模块只能运行一次
- nosql - 在 LiteDB c# 中删除损坏的集合或表
- android - 为什么在 Android 上运行默认的本地单元 ExampleUnitTest 类时总是得到“未找到测试”“未找到类:xxx”?
- java - MassIndexer 不索引任何内容
- java - 我的 kafka 消费者没有按预期消费来自偏移量 0 的消息
- java - java 在有 JTabbedPane 时执行两次 FocusTraversalPolicy
- navbar - Android 中带有 AppCompatActivity 类的导航栏
- python - 如何使用 selenium 向 chrome 发送 POST 请求?
- flutter - 更改其中的数据后颤动刷新obs类列表