Hapi处理程序方法未返回值

时间:2019-04-05 09:52:16

标签: javascript mysql hapijs

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

请帮助。谢谢

3 个答案:

答案 0 :(得分:2)

从Hapi v17开始,所有路由处理程序都应显式返回某些内容。

您会在错误中看到,您不返回任何值,因为您在异步函数的回调中返回了某些内容,而该回调不在主处理函数中。

您可以通过多种方法来处理此问题,第一个方法是将路由处理程序转换为async并使用await来实现异步功能,例如:

handler: async function (request, h) => {
  await connection.query('SELECT 1 + 1 AS solution')
}

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

但是,如果您不希望或不能使用await / async,您仍然可以将带有回调的函数转换为Promise,然后返回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
    })
}

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

答案 1 :(得分:0)

尝试使用异步/等待

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

答案 2 :(得分:0)

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