router.post /使用Node JS,express,猫鼬将嵌套数组添加到MongoDB数据库中

时间:2019-02-24 13:00:06

标签: node.js mongodb express mongoose

在下面,您可以找到使用我的带有位置和票证数组的Place模式创建的位置示例。在票证阵列中有一个嵌套的笔记阵列。我正在尝试使用router.post函数,并使用unshift将笔记上传到数据库,但没有成功。您能告诉我我在做什么错吗?谢谢!

这是我得到的错误:

(节点:36073)UnhandledPromiseRejectionWarning:TypeError:无法读取null的属性“票证”     在Place.findOne.then.place(/Users/fifi/Desktop/FAM./routes/tickets.js:111:13)     在processTicksAndRejections(内部/进程/next_tick.js:81:5) (节点:36073)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。引发此错误的原因可能是抛出了一个没有catch块的异步函数,或者是拒绝了一个.catch()无法处理的承诺。 (拒绝ID:1) (节点:36073)[DEP0018] DeprecationWarning:已弃用未处理的承诺拒绝。将来,未处理的承诺拒绝将以非零退出代码终止Node.js进程。

"_id" : ObjectId("5c716edf8f0d6f7b5b4b310f"), 
"location" : [
    {
        "phoneNumber" : "+1 212-226-3126", 
        "website" : "https://www.apple.com", 
        "contactEmail" : "apple1004SoHo@apple.com", 
        "_id" : ObjectId("5c716edf8f0d6f7b5b4b3110"), 
        "street" : "Prince St", 
        "buildingNumber" : 103, 
        "buildingAddition" : "", 
        "postcode" : "10012", 
        "city" : "New York", 
        "country" : "United States", 
        "latitude" : 40.725056, 
        "longitude" : -73.999027
    }
], 
"tickets" : [
    {
        "status" : "Unassigned", 
        "_id" : ObjectId("5c729175bdfe628cb5a205c3"), 
        "ticketUser" : ObjectId("5c6d2e81e6117a2ddb07b070"), 
        "description" : "Test", 
        "priority" : "Medium", 
        "notes" : [

        ], 
        "createdAt" : ISODate("2019-02-24T12:43:33.342+0000"), 
        "updatedAt" : ISODate("2019-02-24T12:43:33.342+0000")
    }
], 
"customerID" : "Apple", 
"placeID" : "1004", 
"name" : "SoHo", 
"__v" : 2

  router.post('/notes/:id', (req, res) => {
  Place.findOne({
    _id: req.params.id
  })
    .then(place => {
      const newNote = {
        noteBody: req.body.noteBody,
        noteUser: req.user.id,
      }
      place.tickets.notes.unshift(newNote);
      place.save()
        .then(place => {
          res.redirect('back')
        });
    });
});

1 个答案:

答案 0 :(得分:0)

    如果找不到与您的查询相匹配的项目,
  • category_id返回findOnenull
  • 如果项目undefinedplace,则调用null会引发错误

在应用其余逻辑之前,添加一条place.tickets语句以检查您的if项目是否为place

代码

null

注释

  • Place.findOne({ _id: req.params.id }) .then(place => { // Add the IF here if (!place) { return res.status(404).send('Place not found'); } const newNote = { noteBody: req.body.noteBody, noteUser: req.user.id, } place.tickets.notes.unshift(newNote); place.save() .then(place => { res.redirect('back') }).catch(err => res.send(err)); }).catch(err => res.send(err)); 等同于.findOne({_id: req.params.id})
  • 致电.findById(req.params.id)时请不要忘记 catch 。否则,如果服务器遇到错误,您的请求可能会超时并且永远不会返回响应