首页 > 解决方案 > Hapi 处理程序方法没有返回值

问题描述

我正在尝试将 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但在浏览器中,这是一个错误。

请帮忙。谢谢

标签: javascriptmysqlhapijs

解决方案


从 Hapi v17 开始,所有路由处理程序都应该显式地返回一些东西。

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

您有几个选项来处理这个问题,第一个是将您的路由处理程序转换为asyncawait用于异步函数,如下所示:

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 或手动将您的函数包装在 a 中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
    })
}

您的路线的返回值将是 last 的最后一个返回值.then


推荐阅读