我有两个相互关联的模型。如果成功删除了第一个模型的mongo文档,则必须删除其父文档。
是否尝试执行第二次删除时可能会引发异常。有错误或没有错误,我想将第一条消息和第二条消息连接起来,但是“ findOneAndDelete”内部的“ message”变量的范围与其父级不同。
如何完成这项要求?
除了仅传递主消息外,以下代码段均能正常工作。
var id = req.params.id;
var valid = mongoose.Types.ObjectId.isValid(id);
if (valid) {
MyModel
.findByIdAndDelete({"_id": id})
.exec(function (err, result) {
var message = "Item has been removed successful.";
if (!result) {
message = "Error at deleting an about item.";
} else {
// finding and deleting related about image item
var query = { "id": id };
SecondModel
.findOneAndDelete(query).exec(function (err, result) {
// deletion is OK, but the concatenation does not work
// how to return this "message" scope to its parent?
message += " Image item has been removed successful.";
if (!result) {
message += " Error trying to remove about image item.";
}
});
}
// the concatenation should be returned here
responseUtilities.sendJsonResponse(res, err, {"message": message});
});
} else {
responseUtilities.sendJsonResponse(res, false, { "message": "Item id is not valid." });
}
很高兴您找到了答案。这里有一些结构和样式方面的想法,它们使该代码更易于阅读(以后由您或由同事阅读),并使调试和扩展更加容易。首先为两个异步操作构建小的,返回承诺的函数。
function deleteAboutWithId(id) {
return new Promise((resolve, reject) => {
AboutModel.findByIdAndDelete({"_id": id}).exec(function (err, result) {
err ? reject(err) : resolve(result)
})
})
}
function deleteImageWithAboutId(id) {
return new Promise((resolve, reject) => {
AboutImageModel.findOneAndDelete({ aboutId: id }).exec(function (err, result) {
err ? reject(err) : resolve(result)
})
})
}
这些的一个很好的好处是可以对它们进行单元测试,重用,推广等。另一个好处是使用它们可以使您的业务逻辑清晰明了。该代码读取了您向同事描述该功能的方式。
公共职能:
const msgIdError = 'About item id is not valid.'
const msgItemSuccess = 'About item has been removed successful.'
const msgImageSuccess = ' Its image item has also been removed successful.'
const msgItemError = 'Error at deleting an about item.'
const msgImageError = ' Error trying to remove about image item.'
module.exports.delete = function (req, res) {
const idAbout = req.params.idAbout
if (!mongoose.Types.ObjectId.isValid(idAbout)) {
responseUtilities.sendJsonResponse(res, false, { "message": msgIdError })
}
let message = ''
deleteAboutWithId(idAbout).then(() => {
message += msgItemSuccess
return deleteImageWithAboutId(idAbout)
}).then(() => {
message += msgImageSuccess
responseUtilities.sendJsonResponse(res, err, { "message": message })
}).catch(err => {
// if message is empty, the first block threw the error
message += message.length ? msgImageError : msgItemError
responseUtilities.sendJsonResponse(res, err, { "message": message });
})
}
几个简短的注意事项:(1)最好将字符串移开。可能有一天会将它们保留在config中,翻译成其他语言,等等。(2)它会稍微清理代码以检查顶部的无效输入,如果输入无效,则在顶部纾困。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句