TypeError: ответ не является функцией

Используя Hapi v17, я просто пытаюсь сделать простой веб-API, чтобы начать строить свои знания, но я все время получаю ошибку каждый раз, когда я тестирую созданные GET-методы. Ниже приведен код, который я запускаю:

'use strict';
const Hapi = require('hapi');
const MySQL = require('mysql');

//create a serve with a host and port

const server = new Hapi.Server({
   host: 'serverName',
   port: 8000
});

const connection = MySQL.createConnection({
     host: 'host',
     user: 'root',
     password: 'pass',
     database: 'db'
});

connection.connect();

//add the route
server.route({
   method: 'GET',
   path: '/helloworld',
   handler: function (request, reply) {
   return reply('hello world');
}
});

server.start((err) => {
   if (err) {
      throw err;
   }
   console.log('Server running at:', server.info.uri);
});

Ниже приведена ошибка:

Debug: internal, implementation, error 
    TypeError: reply is not a function
    at handler (/var/nodeRestful/server.js:26:11)

Я не уверен, почему возникает проблема с вызовом функции ответа, но сейчас это фатальная ошибка.

Ответ 1

Версия 17 Hapi имеет совершенно другой API.

https://hapijs.com/api/17.1.0

Обработчикам маршрутов больше не передается функция reply в качестве второго аргумента, вместо этого им передается нечто, называемое Response Toolkit, которое представляет собой объект, содержащий свойства и утилиты для обработки ответа.
С новым API вам даже не нужно использовать Response Toolkit для возврата простого текстового ответа, как в вашем случае, вы можете просто вернуть текст из обработчика:

//add the route
server.route({
  method: 'GET',
  path: '/helloworld',
  handler: function (request, h) {
    return 'hello world';
  }
});

Response Toolkit используется для настройки ответа, например, для установки типа контента. Пример:

  ...
  handler: function (request, h) {
    const response = h.response('hello world');
    response.type('text/plain');
    return response;
  }

Примечание: с этим новым API server.start() не принимает функцию обратного вызова, и если вы в любом случае предоставите ее, она не будет вызываться (вы могли заметить, что console.log() в вашей функции обратного вызова никогда не происходит). Теперь server.start() возвращает Обещание, которое можно использовать для проверки правильности запуска сервера.

Я считаю, что этот новый API предназначен для использования с синтаксисом async-await.

Ответ 2

Чтобы решить эту проблему, вам просто нужно заменить return reply('hello world'); на return 'hello world'; Ниже приведено описание:

В соответствии с hapi v17.x они заменили интерфейс reply() новым интерфейсом методов жизненного цикла:

  • удален response.hold() и response.resume().

  • методы являются асинхронными, и требуемое возвращаемое значение является ответом.

  • набор инструментов ответа (h) предоставляется с помощью помощников (вместо украшений reply()).

Ответ 3

Кажется, у вас есть дублирование в вашем коде:

const server = new Hapi.Server({
   host: 'serverName',
   port: 8000
});

// Create a server with a host and port
// This second line is not needed!!! and probably is causing the error 
//you described
const server = new Hapi.Server();