Hapi 处理程序方法未返回值

Hapi handler method is not returning a value

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

请帮忙。谢谢

尝试使用 async/await

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

我通过将回调转换为 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 方面的技能。

自 Hapi v17 起,所有路由处理程序都应明确 return 某些内容。

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

你有几种选择来处理这个问题,第一个是将你的路由处理程序转换为 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 return Promise 而不是 NodeJS 回调样式时有效。如果没有,您可以查看 utils.promisify 将带有回调的函数转换为 Promise 或手动将您的函数包装在 new Promise 中。

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

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

您的路线的 return 值将是最后 .then 的最后 return 值。