[英]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.