我当前的ExpressJS-Application存在问题。我使用普通函数来包装应用程序中的不同路由,当发生错误时,我可以轻松地使用return next (err)
退出函数(return
)并调用错误处理程序(next (err)
)。
但如果有多个折叠函数我想要阻止执行,该怎么办?
在我的代码中,有基本路由功能,在那里,我有多个其他功能(它们是回调)。在这些回调中,我希望能够完全退出路由执行。目前,return next (err)
仅退出当前回调,但随后继续执行该路由。
感谢您的任何建议!
编辑:我已经分解了一些代码来描述问题:
// This function is an expressJS route
function doSomeStuff (req, res, next) {
var mongooseObj = new mongooseModel ({});
mongooseObj.save (function (err) {
if (err)
return next (new Error ("whatever"));
// The line above returns from the callback, the expressJS error-handler handles the error, but then the code execution continues below
});
// Function continues here
}
答案 0 :(得分:1)
当然它不会中断你的程序流程!您没有从doSomeStuff
返回,而是从您传递给save
的匿名回调中返回。此功能仅在保存程序完成后调用,并且不停止您的程序流程。
save
来说,Mongoose supports promises。因此,解决问题的正确方法是:
// This function is an expressJS route
function doSomeStuff (req, res, next) {
var mongooseObj = new mongooseModel ({});
var p = mongooseObj.save();
p.then(function() {
// Other stuff that needs to be done *after* save succeeds
})
.catch(function(err) { next (new Error ("whatever")); })
}
答案 1 :(得分:0)
从我的看法,你试图使用一个回调中抛出的错误从一个调用这个回调的函数返回。你应该真正研究一下promises因为它会让这个过程变得更容易。您可以填充promises并在旧版本的Node中使用它们。
我试图在承诺中重写这个的方式是:
function doSomethingStuff (req, res, next) {
return new Promise (resolve, reject) {
var mongooseObj = new mongooseModel ({});
mongooseObj.save (function (err) {
if (err)
reject (new Error ("whatever"));
else {resolve("something")}
});
}
doSomethingStuff(params)
.then(//return from function)
.catch ( function (err) { return err;}
像这样编写代码可以让你使用回调中的错误从主函数返回。