通过params更新Mongo DB条目

时间:2017-10-12 15:22:06

标签: node.js mongodb server

此计划的目标是添加一个名为' userResponse'到反映用户输入的问题对象。 Mongo DB中的问题对象保存在一个名为“问题”的对象数组中,该对象保存在名为“会话”的对象中:

{
    "_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]);
        }); 
    })

}) 

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

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

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

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

另外,如果没有捕获语句,则有两个链式承诺似乎很脆弱......

有人可以提供有关如何改进此流程的建议吗?此逻辑确实成功更新了数据库,但存在错误。有没有更好的办法?

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

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

1-从数据库会话文档的结构_id的类型为ObjectId,当您尝试查找时,您只需找到可能需要使用的字符串的id { {1}}

2-错误,我可以说ObjectId(req.params.sessionId)的值不包含一系列问题...所以itemitems.problems所以undefined是错误。

3-您不需要两次查找会话文档项来更新数组,我更新了代码以使用单个更新操作更新数组中的undefined[0]值。

4-为了更好的错误处理和代码可维护性,您需要处理userResponse拒绝,因此您需要处理promise以及使用catch

所以从上面的评论中我可以将你的代码更新为

then