在ExpressJS中从promise中返回错误

时间:2016-08-07 17:07:30

标签: javascript node.js express mongoose

我当前的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
}

2 个答案:

答案 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;}            

像这样编写代码可以让你使用回调中的错误从主函数返回。