首页 > 解决方案 > node.js 表达承诺路由器错误处理包装器

问题描述

我正在尝试创建一个错误处理包装器,以与 nodejs 中 express 的 promise 路由器扩展一起使用。

对于初学者,我尝试简单地包装异步处理函数:

function error_catcher(f)
{
    return (async function (request, response) {
        await f(request, response);
    });
}

router.get("/bar", (error_catcher((async (request, response) => {
    throw (new Error("bar error"));
}))()));

但是,当我运行它时,我得到:

Error: Expected a callback function but got a [object Promise]
    at wrapHandler (/tmp/complete/node_modules/express-promise-router/lib/express-promise-router.js:10:15)
    at /tmp/complete/node_modules/express-promise-router/lib/express-promise-router.js:87:24
    at Array.map (<anonymous>)
    at Function.instanceToWrap.(anonymous function) [as get] (/tmp/complete/node_modules/express-promise-router/lib/express-promise-router.js:86:38)
    at Object.<anonymous> (/tmp/complete/server.js:361:8)
    at Module._compile (module.js:653:30)
    at Object.Module._extensions..js (module.js:664:10)
    at Module.load (module.js:566:32)
    at tryModuleLoad (module.js:506:12)
    at Function.Module._load (module.js:498:3)

因此,如果有人能指出我的错误并帮助我使异步函数的包装器工作,我应该能够自己添加异常捕获和错误处理。

标签: javascriptnode.jspromise

解决方案


你需要这样的中间件

const error_catcher = fn =>
  (request, response, next) => {
    Promise
      .resolve(fn(request, response, next))
      .catch(next);
};

你可以像这样使用它

router.get("/bar", error_catcher(async (request, response, next) => {
  return await next(new Error("bar error"));
}));

推荐阅读