Hapi 处理程序方法未返回值

bra*_*rar 2 javascript mysql hapi.js

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

    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)
          });

    }
});
Run Code Online (Sandbox Code Playgroud)

它是在说Error: handler method did not return a value, a promise, or throw an error

在这里,我回来了,('The solution is: ', results[0].solution)但它仍然不起作用。

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

请帮忙。谢谢

fel*_*omi 5

从 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;
}
Run Code Online (Sandbox Code Playgroud)

注意connection.query:只有当您返回 Promise 而不是 NodeJS 回调样式时,这才有效。如果没有,您可以尝试将utils.promisify带有回调的函数转换为 Promise,或者通过将函数包装在您new Promise自己中手动将函数转换为 Promise。

但是,如果您不想或不能使用等待/异步,您仍然可以将带有回调的函数转换为 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
    })
}
Run Code Online (Sandbox Code Playgroud)

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