在以下代码中,当err
的回调函数返回deleteUser
变量时,我想将错误插入数据库并使用{结束HTTP请求(和整个代码块) {1}}。
相反,代码继续运行并且return res.send(500)
被调用,即使HTTP请求已经结束。这可以通过帖子底部的日志来证明。
db.destroy
我认为这种情况正在发生,因为我的// DELETE
app.del('/api/users', function(req, res) {
var id = req.query.id;
// get latest copy of database entry first, in case we need to save error message
db.get(id, {revs_info: true}, function(err, doc) {
if (err) {
console.error('Unable to find document', id, 'due to:', err);
return res.send(500);
} else {
// issue delete request first, if fails save error message
deleteUser(doc.EmailAddress, function(err) {
if (err) {
// update database with error message (if there's already a message, append)
doc.Notes = (doc.Notes === '') ? err : err + " " + doc.Notes;
db.insert(doc, function(err, document) {
if(err) {
console.error('Deleting a user failed (1) and updating database with error status failed (2) as well. 1:', doc.Notes, '2:', err);
return res.send(500);
} else {
console.error('Deleting a user failed (with the following) and the error has been stored in the database:', doc.Notes);
return res.send(500);
}
});
}
// proceed to delete from database as well
db.destroy(doc._id, doc._rev, function (err, body) {
if(err) {
console.error('Error deleting document', doc._id, 'with:', err);
return res.send(500);
} else {
if (doc._revs_info) delete doc._revs_info;
console.log('Succesfully deleted user from system and our database:', doc);
return res.send(200);
}
});
});
}
});
});
语句只会结束return
函数。
在节点中是否有解决此问题的通用设计模式?
我应该在db.insert
声明后但在结束return
代码块之前添加另一个db.insert
语句吗?
向我的服务器实例发出DELETE请求后记录:
if (err) {
答案 0 :(得分:2)
首先,是,在关闭return
之前添加if() {}
语句。这是至关重要的。
其次,您的代码会受到callback hell的影响,您应该认真考虑切换到更现代的#34;另外,我个人最喜欢的是承诺。 Here's a great article about this
对于节点,请尝试查看bluebird或es6-promisify
答案 1 :(得分:0)
你可以在某个高位置引入一个错误标志,默认为false:
var bFatalError = false;
您在检测到致命错误的任何地方,在返回之前设置此标志:
bFatalError = true;
如果设置了标志,则可以在每个代码块的顶部进行测试和中止:
if (bFatalError) { return; }
通过这种方式,您将发出其他代码无法启动的信号。