如何在Restify中间件中捕获未处理的Promise拒绝?

我在Node.js上写了一个Restify应用程序 而我需要有一个函数,当Restifycallback中发生一些错误时会被调用。 这个函数应该发送一个响应给客户端。 如果我不使用承诺或asynchronous函数,我可以做这样的事情:

server.on('uncaughtException', (req, res, route, err) => { log.error(err); res.send(err); }); 

但是,如果我的callback是async函数,那么函数内的exception不会被调用,而是引发unhandledPromiseRejection

我如何重构我的代码,以便处理未处理的Promise拒绝,就像处理常见错误一样?

是的,我知道我可以检查Restify中间件本身的错误,但是它仍然会使代码更复杂,写起来更容易

 if (!core.validateUUID(req.params.deviceId)) { throw new Error(`Device ${req.params.deviceId} is wrong`) } 

然后

 if (!core.validateUUID(req.params.deviceId)) { return next(new restify.InvalidArgumentError({ body: { success: false, error: `Device ${req.params.deviceId} is wrong`, } })); } 

我一直在努力,我想出了一个简单的解决scheme。 我创build了一个简单的包装函数,它封装了路由处理程序/中间件,并在代码中运行代码。 这样,可以处理未处理的拒绝和未捕获的exception是相同的callback:

 // your error general handler function errorResponse(req, res, err) { ... } /** * When using promises inside handler, you need to return the Promise from it to allow proper rejection handling * * @param {Function} callback with `req`, `res` and `next` parameters * @returns {Function} */ function catcher(callback) { return (req, res, next) => { Promise .resolve() .then(() => callback(req, res, next)) .catch(err => errorResponse(req, res, err)); }; } // use it like this server.use(catcher(middleware1)); server.post(catcher(postRoute)); server.get(catcher(getRoute)); 

在处理程序中使用promise时,需要从Promise中返回Promise以允许正确的拒绝处理。