Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将被拒绝的承诺转换为异常并从Express route处理程序中抛出它?_Javascript_Node.js_Express_Promise_Q - Fatal编程技术网

Javascript 如何将被拒绝的承诺转换为异常并从Express route处理程序中抛出它?

Javascript 如何将被拒绝的承诺转换为异常并从Express route处理程序中抛出它?,javascript,node.js,express,promise,q,Javascript,Node.js,Express,Promise,Q,在我的一个应用程序的路由处理程序中,我调用了一个返回Q承诺的方法。我不希望使用.catch方法处理拒绝,而是希望它被抛出,并被我的Express应用程序的“捕获所有错误”处理程序捕获 我尝试了Q的done方法,但它异步抛出异常,因此它不是由我的“捕获所有”错误处理程序处理的,而是一路传播,我的应用程序终止: // The route handler function index(req, res) { dao.findById(id).then(function (data) {

在我的一个应用程序的路由处理程序中,我调用了一个返回Q承诺的方法。我不希望使用
.catch
方法处理拒绝,而是希望它被抛出,并被我的Express应用程序的“捕获所有错误”处理程序捕获

我尝试了Q的
done
方法,但它异步抛出异常,因此它不是由我的“捕获所有”错误处理程序处理的,而是一路传播,我的应用程序终止:

// The route handler 

function index(req, res) {
    dao.findById(id).then(function (data) {
        res.send(data);
    }).done();
}

// The catch all event-handler

function catchAllErrorHandler(err, req, res, next) {
    console.log(err, req, res);
}

// Registration of the catch-all event handler

app.use(catchAllErrorHandler);
错误永远不会进入“捕获所有”错误处理程序。有没有办法让抛出的错误由
catchAllErrorHandler
处理

我尝试了Q's done方法

这可能是你对承诺提出异议的最好办法了

但它异步抛出异常

当然,承诺总是异步的。您无法确定您的承诺是否会在将来拒绝并同步抛出异常

有没有办法让抛出的错误由
catchAllErrorHandler
处理

以处理程序的形式显式传递处理程序:

dao.findById(id).then(function (data) {
    res.send(data);
}).catch(catchAllErrorHandler);

或者,由于Q v1.3版,您可以使用并将您的
catchAllErrorHandler
放在那里。

这不会直接回答您的问题,而是显示了实现目标的另一种方法

express中的每个中间件处理程序都有签名
(请求、响应、下一步)
。当前,您的
索引
函数没有定义next

当使用参数调用next时,express将该参数视为错误,并对其进行适当的管理

因此,在您的情况下,更改
index
函数以包含下一个参数,并将
.done()
更改为
.catch(next)
,它将在出现任何错误时调用next,并允许express处理它

dao.findById(id)
   // Handle success
    .then(function (data) {
        res.send(data);
    })
    // Handle failure
    .catch(next);

索引
函数更改为包含
下一个
(作为第三个参数),然后将
.done()
更改为
.catch(next)
@major mann如果我将一个参数传递给
下一个
,是否认为这是一个错误?我认为您的解决方案可行。如果您将其作为解决方案发布,我将接受。是的,将参数传递给next是显式传递错误的方法。我会在下手机后发布解决方案:)不用担心。我认为你的解决方案不再有效了。我知道这很管用捕获所有错误处理程序是一个中间件,在代码的其他地方定义,并使用
app.use
注入。所以这个解决方案对我不起作用。啊,在这种情况下,你可能只想
。捕获(…)
异常并将它们传递给
下一个