【问题标题】:Hapi handler method is not returning a valueHapi 处理程序方法没有返回值
【发布时间】:2019-08-27 04:46:28
【问题描述】:

我正在尝试将 hapi.js 与 mysql 连接。但是在定义 server.route 时。 handler 没有返回值。

    server.route({
    method:'GET',
    path:'/hello',
    handler:function(request,h) {

        connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
            if (error) throw error;

            console.log('The solution is: ', results[0].solution);

            return ('The solution is: ', results[0].solution)
          });

    }
});

上面写着Error: handler method did not return a value, a promise, or throw an error

在这里,我正在返回('The solution is: ', results[0].solution),但它仍然无法正常工作。

控制台中的输出是The solution is: 2,但在浏览器中,却是一个错误。

请帮忙。谢谢

【问题讨论】:

  • 回调返回不能视为主函数的返回。
  • 您知道解决方法吗?我尝试在主函数 var solution = "text" 中创建一个变量,然后在回调中创建一个变量 return solution = 'The solution is: ' + results[0].solution 。但是还是不行
  • 你检查我的答案了吗?你知道如何使用 Promise 吗?
  • 我检查了你的答案。我不知道如何使用承诺。对此感到抱歉。我会搜索如何使用它。谢谢你的回答

标签: javascript mysql hapijs


【解决方案1】:

自 Hapi v17 起,所有路由处理程序都应显式返回一些内容。

正如您在错误中看到的那样,您没有返回任何值,因为您在异步函数的回调中返回了一些不在主处理函数中的内容。

你有几个选项来处理这个问题,第一个是将你的路由处理程序转换为 async 并使用 await 进行异步函数,如下所示:

handler: async function (request, h) => {
  const result = await connection.query('SELECT 1 + 1 AS solution')
  return result // do something with sql result then return it;
}

注意:这仅在您的 connection.query 返回 Promise 而不是 NodeJS 回调样式时才有效。如果没有,您可以查看 utils.promisify 以将带有回调的函数转换为 Promise 或手动将您的函数包装在 new Promise 中。

但是,如果您不想或不能使用 await/async,您仍然可以将带有回调的函数转换为 Promise,然后返回 Promise,但这会导致大量的 then 链接。

const { promisify } = require('util');

[...]

handler: function (request, h) {
  const query = promisify(connection.query);

  return query('SELECT fancy SQL')
    .then(result => {
      // do something with sql result
     return result
    })
}

你的路由的返回值将是最后一个.then的最后一个返回值。

【讨论】:

  • 在你的 async/await 处理程序中,你做同样的事情(即你不返回任何东西)。你会得到相同的Error: handler method did not return a value, a promise, or throw an error
  • @GoalBased 你绝对是我编辑了我的答案以匹配你的评论,谢谢
【解决方案2】:

尝试使用异步/等待

server.route({
    method: 'GET',
    path: '/hello',
    handler: async function (request, h) {

        try {
            const { credentials, artifacts } = await request.server.auth.test('default', request);
            return { status: true, user: credentials.name };
        }
        catch (err) {
            return { status: false };
        }
    }
});

【讨论】:

  • 它正在返回"status": false
【解决方案3】:

我通过将回调转换为 Promise 解决了这个问题。

  handler: (request, h) => {


                return new Promise ((resolve, reject)=> {

                    connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
                         if (error) throw error;
                         console.log('The solution is: ', results[0].solution);
                         let solution = 'The solution is: ' + results[0].solution
                         let view = () => {
                             return  h.view('landing-page', {solution: solution});
                         }

                         return resolve(view())
                       });


                })


            }

我的问题不在于 hapi 或 mysql,而是我的 javascript 技能。

【讨论】:

    猜你喜欢
    • 2017-12-26
    • 2019-08-12
    • 1970-01-01
    • 2019-04-04
    • 2015-10-12
    • 2021-08-08
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多