我正在尝试开发一个流模式来处理尝试执行数据库操作时遇到的错误。我有点失落,但我想我已经非常接近搞清楚了。这是我一直试图模仿的例子:https://codereview.stackexchange.com/questions/65199/mongoose-promise-error-handling
这是我的mongoose模式的函数:
exports.deleteAttorney = function (id, cb) { <-- I am not using cb. Do I need it?
let query = {
_id: "6a34056376bbd68eb1ccdf11"
};
Firm.Firm.findOne( query, "attorneys", function (err, firm) {
if (err || !firm) {
return next( err || new Error("deleteAttorney() could not retrieve the firm's attorneys.") );
}
firm.attorneys.id(id).remove();
firm.save(function (err) {
if (err) {
return next(err);
}
});
});
}
这是我在路由器中调用它的地方:
router.post('/delete', function(req, res) {
Attorney.deleteAttorney(req.query._id, function(err) {
if (err) {
console.error(err); <-- I intend to put some user-friendly messaging here
}
res.redirect('/attorneys/manage');
});
});
“下一步”未定义。我不完全了解如何使用它,我不确定是否应该使用它。
我想要的是尝试获取数据。尝试完成后(无论是否成功),我希望如图所示的回调运行。从模型的方法中,看起来我需要将任何错误返回给回调,但我不知道如何。
如果我使用不好的方法,应该怎么做?
Josh的回答有助于证实我怀疑用cb()替换next()。这是修改后的代码。有用。这看起来像是一种好习惯吗?如果是这样,我将对所有数据库操作使用相同的模式。我不想跳到其他人,直到我解决这个问题。
exports.deleteAttorney = function (id, cb) {
let query = {
_id: "6a34056376bbd68eb1ccdf11"
};
Firm.Firm.findOne( query, "attorneys", function (err, firm) {
if (err || !firm) {
cb( err || new Error("deleteAttorney() could not retrieve the firm's attorneys.") );
return;
}
firm.attorneys.id(id).remove();
firm.save(function (err, firm, numAffected) {
cb(err, firm, numAffected);
return;
});
});
}
当你打电话给next
时,你想要打电话的是cb
。所以重命名其中之一。此外,您不仅应该在发生错误时调用next
,还应该在操作成功时调用article。否则,永远不会调用您的重定向。
我认为你应该花一些时间来理解回调,这是Node.js的基础,同时,看一下错误的第一个模式。也许这个qazxswpoi可以帮助你。