通过参数更新 Mongo DB 条目



该程序的目标是向问题对象添加一个名为"userResponse"的属性,以反映用户的输入。 Mongo DB中的问题对象保存在称为"问题"的对象数组中,该对象保存在名为"session"的对象中:

{
"_id" : ObjectId("59df5ee7adb378237377dbb4"),
"updatedAt" : ISODate("2017-10-12T12:24:07.269Z"),
"createdAt" : ISODate("2017-10-12T12:24:07.269Z"),
"userId" : "59df5edbadb378237377dbb3",
"problems" : [
{
"correctResponse" : 23,
"problem" : "20 + 3",
"secondTerm" : 3,
"firstTerm" : 20
} ]
}

以下是我一直使用的端点的逻辑:

router.patch( '/session/:sessionId/:index', passport.authenticate( 'jwt', { session: false } ), ( req, res ) => {
Session.findOne({_id: req.params.sessionId})
.then( (item)=>{
item.problems[req.params.index].userResponse = req.body.userResponse;
Session.update({_id: req.params.sessionId}, item).then( (updated)=>{
res.json(updated.problems[req.params.index]);
}); 
})
}) 

我看了其他一些例子(一两个),但它们似乎并不相关,因为这是由参数标识的数组单个元素的补丁。

此方法有效,因为它使用对象上的新属性成功更新数据库,但在执行期间服务器会记录此错误:

(node:10955) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property '0' of undefined

我的理解是,这意味着在某些时候无法在数据库中找到该对象,但由于数据库确实包含新属性,因此必须稍后解决。 这是正确的吗?

此外,有两个没有捕获声明的链式承诺似乎很脆弱......

任何人都可以就如何改进此过程提供建议吗? 此逻辑确实成功更新了数据库,但出现错误。 有没有更好的方法?

谢谢你的时间。

好吧,我可以在代码中看到可能导致您的问题的多个问题

1-从数据库会话文档的结构中,_id的类型为ObjectId,当您尝试查找时,您仅通过id进行查找,该id可能是您需要使用的字符串ObjectId(req.params.sessionId)

2-从错误中,我可以判断出item的值不包含一系列问题...所以items.problemsundefined所以undefined[0]是一个错误。

3-您无需两次查找会话文档项即可更新数组,我使用单个更新操作更新了代码以更新数组中的userResponse值。

4-为了更好的错误处理和代码可维护性,您需要处理promise拒绝,因此您需要处理catch就像处理then

一样所以从上面的评论中,我可以更新你的代码

var mongoose = require('mongoose');
router.patch( '/session/:sessionId/:index', passport.authenticate( 'jwt', { session: false } ), ( req, res ) => {
var index = req.params.index;
Session.update({_id: mongoose.Types.ObjectId(req.params.sessionId) }, {$set : {"problems." + index +  ".userResponse" : req.body.userResponse } )
.then( (updated)=>{
console.log(updated);
res.json(updated.problems[req.params.index]);
})
.catch((err) => {
console.log(err.message);
res.json({status: "error" , message:err.message});
});
}) 

最新更新