【发布时间】:2018-08-13 10:03:00
【问题描述】:
使用 mongoose 和 Express 作为基本数据端点,我在 CRUD 操作的 Update 部分遇到问题。
在 Postman 中测试更新路径有效,但是当我从我的 Angular 应用程序中尝试时,它会返回:
MongoError: 更新路径 '__v' 会在 '__v' 处产生冲突 在 C:\Users\rutherfordc.AA\Documents\GitHub\techInventory\node_modules\mongoose\node_modules\mongodb-core\lib\conne 行动\pool.js:595:61 在 authenticateStragglers (C:\Users\rutherfordc.AA\Documents\GitHub\techInventory\node_modules\mongoose\node_module s\mongodb-core\lib\connection\pool.js:513:16) 在 Connection.messageHandler (C:\Users\rutherfordc.AA\Documents\GitHub\techInventory\node_modules\mongoose\node_mod ules\mongodb-core\lib\connection\pool.js:549:5) 在 emitMessageHandler (C:\Users\rutherfordc.AA\Documents\GitHub\techInventory\node_modules\mongoose\node_modules\mo ngodb-core\lib\connection\connection.js:309:10) 在套接字。 (C:\Users\rutherfordc.AA\Documents\GitHub\techInventory\node_modules\mongoose\node_modules\mo ngodb-core\lib\connection\connection.js:452:17) 在 Socket.emit (events.js:160:13) 在 addChunk (_stream_readable.js:269:12) 在 readableAddChunk (_stream_readable.js:256:11) 在 Socket.Readable.push (_stream_readable.js:213:10) 在 TCP.onread (net.js:602:20)
我真的不想更新__v,但我不明白为什么会触发它。如何强制忽略它?
这是我的更新方法:
update(req,res){
let _computer = req.body;
let _id = req.params.computerId;
Computer.findOneAndUpdate({'_id':_id}, _computer, {upsert: true}, (err, uc) => {
if(err){
log.error(err);
res.status(500).send(err);
}else{
res.status(200).send(uc);
}
});
}
【问题讨论】:
-
请求正文中是否发送了
__v? -
是的,我试图阻止它在初始读取请求中发送到客户端,或者在从客户端发送补丁请求之前将其删除。
-
在致电
findOneAndUpdate之前,您是否尝试过delete _computer.__v?您还可以尝试在您的查找查询上设置挂钩,以从返回的结果中排除 __v,这样 __v 如果适用于您的情况,就永远不会到达您的前端。 -
@foxinatardis 后者将是理想的。所以我的
read()和readOne()处理程序在res.send()之前执行delete obj.__v;? -
你可以这样做。我建议使用一个中间件挂钩,它将普遍排除在查找查询之外。见:mongoosejs.com/docs/middleware.html
标签: javascript node.js mongodb mongoose