Route.get()需要回调函数,但得到一个[object Promise]

时间:2019-02-18 10:55:29

标签: javascript node.js express

我正在使用express创建REST API,遵循this article中的体系结构。 简而言之,路由器正在调用控制器。

这是一个通话示例:

router.get('/', ModelsController.getModels)

到目前为止,这项工作还不错,现在,我正在改善Boom的错误处理。

我想像this article中那样使用包装器,但是由于我不使用TS,并且我不熟悉Promises,所以我为此感到困惑。

这是包装纸:

exports.enhanceHandler = async function (handler) {
    return async function (req, res, next) {

        try {
            const result = await handler(req, res);
            if (result instanceof Error && Boom.isBoom(result)) {
                res.status(result.output.statusCode).send(formatBoomPayload(result));
            }
        } catch (error) {
            // now log errors to your errors reporting software
            if (process.env.NODE_ENV !== "production" && (error.stack || error.message)) {
                res.status(500).send(error.stack || error.message);
            } else {
                res.status(500).send(Boom.internal().output.payload);
            }
        }

        next();
    }
}

我正试图在路由器中调用它,就像这样:

router.get('/handler', enhanceHandler(ModelsController.getModels))

但是,我遇到了这个错误:

Error: Route.get() requires a callback function but got a [object Promise]

我该怎么办?我需要兑现诺言吗?修改EnhanceHandler以便它返回一个函数而不是一个Promise?

2 个答案:

答案 0 :(得分:3)

每个promise对象都有一个.then方法,您需要使用.then方法从promise对象中获取结果,例如:

handler(req, res).then((res) => {
    if (res instanceof Error && Boom.isBoom(res)) {
        res.status(res.output.statusCode).send(formatBoomPayload(res));
    }
});

如果我们不再使用等待,我们还可以从函数中删除异步。

答案 1 :(得分:1)

让我们看看发生了什么。 您已经调用了get(),并为第二个参数使用了EnhanceHandler()调用。 任何异步功能的调用都会返回Promise 。 而get需要一个函数引用作为第二个参数。

因此,首先必须避免在为get()提供第二个参数的函数上使用async关键字。