簡體   English   中英

貓鼬推入陣列不起作用

[英]mongoose push into array not working

我正在使用后端的Nodejs和MongoDB作為數據庫來制作Library Management應用程序。 這是一個簡單的快遞服務器,使用貓鼬庫。 必須發行書籍的客戶端發送POST請求,並將其記錄添加到數據庫中。 這是我的日志的模型:

var Logs = mongoose.model('Logs', {


bookid: {
    type: Number,
    required: true,
    minlength: 1
  },
  status: {
    type: String,
    required: true,
    minlength: 1,
    trim: true
  },
  details: [{
    issuedby: {
      type: String,
      trim: true
    },
    issuedate: {
      type: Date,
    },
    returndate: {
      type: Date
    }
  }]
});  

現在,當收到POST請求時,我嘗試將書籍的“狀態”從“可用”更改為“已發行”,並在“詳細信息”字段中添加客戶的記錄。 這是代碼:

app.post('/issueBook', (req,res) => {
  console.log(req.body);
  Logs.findOne({bookid: req.body.bookid}).then((doc) => {
    if(doc.status == "Available"){
      var detail = {};
      detail.issuedby = req.body.issueTo;
      detail.issuedate = new Date();
      Logs.findOneAndUpdate({bookid: req.body.bookid}, {$set: {status:"Issued"}}, {$push: {details:detail}}, {upsert: true}, function(err,doc) {
        if(err) {
          console.log("Couldn't issue");
          res.status(400).send(err);
        } else{
          res.send("OK");
        }
      });
    } else{
      res.send({
        status: "Error",
        reason: "Book already issued !"
      });
    }
  }, (e) => {
    res.send({
      status: "Error",
      reason: "Invalid Book ID !"
    });
  });
});  

當我發送此POST請求時,服務器崩潰。 在檢查數據庫時,我發現“狀態”字段已成功從“可用”更改為“已發行”,但未在“詳細信息”中插入任何記錄。 我的查詢有問題嗎? 請提出對我的代碼的更正。
這是崩潰時的錯誤摘要:

終端錯誤如下所示:

在此處輸入圖片說明

更改此代碼


Logs.findOneAndUpdate({bookid: req.body.bookid}, {$set: {status:"Issued"}}, {$push: {details:detail}}, {upsert: true}, function(err,doc)

對此


Logs.findOneAndUpdate({bookid: req.body.bookid}, {$set: {status:"Issued"}}, {$push: {details:detail}}, {upsert: true}).then((result) => {
  console.log(result)
}.catch((error) => {
  console.log(error)
}

請告訴我console.log(error)將返回您什么,並且根據該錯誤消息,我能夠為您提供最終答案。

更新資料


您可以嘗試以下代碼塊。 此代碼將查找具有您將在request.body中提供的ID且狀態為Available的日志。 如果此查詢找到日志,它將在響應中將其發送回去。 如果沒有,它將拋出一個找不到的錯誤。

app.post('/api/issueBooking', (request, response) => {

Log.findOneAndUpdate({
         bookid: request.body.bookid,
         status: "Available"
       }, {
         $set: {
           status: "Issued"
         }
       }, {
         $push: {
           "details": {
             issueby: "issueByHere",
             issuedate: "issueDateHere",
             returndate: "returnDateHere"
           }
         },
         {
           upsert: true
         }).then((log) => {

         if (!log) {
           return Promise.reject({
             status_code: 404,
             message: "Log not found."
           })
         }

         response.status(200).send("OK");

       }).catch((error) => {
         response.status(error.status_code).send(error.message);
      })
  });

該錯誤可能是因為您沒有正確更新詳細信息字段。 正如我在您的模式中看到的那樣,您已將details定義為[]但正在使用對象{}對其進行更新。 您必須解決該問題。 但我也認為您可以使腳本更好。 該聲明:

Logs.findOneAndUpdate({bookid: req.body.bookid}, {$set: {status:"Issued"}}, {$push: {details:detail}}, {upsert: true}, function(err,doc) {

似乎多余。 您已經有了需要更新的文檔:

Logs.findOne({bookid: req.body.bookid}).then((doc) => {

獲取此doc ,只需修改您想要的類似於javascript對象的內容,然后執行doc.save

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM