Метод-обработчик Hapi не возвращает значение - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь соединить 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 ]

2 голосов
/ 07 апреля 2019

Начиная с 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.

0 голосов
/ 05 апреля 2019

Я решил эту проблему, преобразовав свой обратный вызов в обещание.

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


                })


            }

Моя проблема не связана с хапи или mysql, а скорее с моим навыком в javascript.

0 голосов
/ 05 апреля 2019

Попробуйте использовать 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 };
        }
    }
});
...