2017-10-12 42 views
0

此程序的目标是向反映用户输入的问题对象添加一个名为'userResponse'的属性。问题对象蒙戈DB是对象的数组,被称为“问题”举行,也就是在所谓的“会话”对象举行:通过params更新Mongo数据库条目

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

}) 

我看着其他一些例子(onetwo),但它们似乎初步认识并不因为这是一个补丁作为识别由PARAMS阵列的单个元件。

这种方法适用,因为它成功地更新与对象的新属性数据库,但在执行过程中服务器日志此错误:

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

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

此外,它似乎脆有没有catch语句两个链式承诺......

任何人都可以提供关于如何改进这个过程的建议?这个逻辑不会成功更新数据库,但有错误。有没有更好的办法?

谢谢你的时间。

回答

1

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

1-从数据库会话文件_id的结构ObjectId型的,当你试图找到,你是刚刚发现ID这可能是字符串,你需要使用ObjectId(req.params.sessionId)

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

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

4-您需要,所以你需要处理catch以及处理promise拒绝,你与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}); 
    }); 
}) 
+0

非常好!非常感谢您的时间,我对Mongo/Mongoose是新手,这是一个很大的帮助。 – Cameron

+0

欢迎您:) ...很高兴它帮助...如果这回答你的问号,它被接受... –