【问题标题】:Route.get() requires callback function but got a [object Promise]Route.get() 需要回调函数,但得到了 [object Promise]
【发布时间】:2021-08-17 14:29:48
【问题描述】:

我正在使用 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 让它返回一个函数而不是一个承诺?

【问题讨论】:

  • 使用async 关键字存在冲突。如果你有next 参数,你应该使用所有回调
  • 我添加了 async 因为 await 仅在 async 函数中有效。你能告诉我更多关于如何使用所有回调吗?
  • exports.enhanceHandler = async function (handler)中删除async关键字

标签: javascript node.js express


【解决方案1】:

每个 Promise 对象都有一个 .then 方法,您需要使用该方法从 Promise 对象中获取结果,如下所示:

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

如果我们不再使用 await,我们也可以从函数中移除 async。

【讨论】:

    【解决方案2】:

    Handler 需要同步,但是它返回的函数可以保持异步。

    exports.enhanceHandler = function (handler) { // delete "async" keyword
       return async function (req, res, next) {
    
            try {
                const result = await handler(req, res);
                if (result instanceof Error && Boom.isBoo
        ..
    
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        相关资源
        最近更新 更多