TypeError: reply is not a function

TypeError: reply is not a function

使用 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)

我不确定为什么调用回复函数时会出现问题,但目前这是一个致命错误。

您的代码似乎有重复:

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

Hapi 版本 17 有一个完全不同的 API。

https://hapijs.com/api/17.1.0

路由处理程序不再作为第二个参数传递给 reply 函数,而是传递给它们称为 Response Toolkit 的东西,它是一个包含用于处理响应的属性和实用程序的对象。
使用新的 API,您甚至不必像您的情况那样使用响应工具包来 return 简单的文本响应,您可以简单地 return 来自处理程序的文本:

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

响应工具包用于自定义响应,例如设置内容类型。例如:

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

注意: 有了这个新的 API,server.start() 不接受回调函数,即使您提供回调函数也不会被调用(您可能已经注意到回调函数中的 console.log() 从未发生过)。现在,server.start() return 是一个 Promise,可用于验证服务器是否正常启动。

我相信这个新的 API 是为与 async-await 语法一起使用而设计的。

要解决此问题,您只需将 return reply('hello world'); 替换为 return 'hello world'; 以下是说明:

根据 hapi v17.x 他们用新的生命周期方法接口替换了 reply() 接口:

  1. 删除了 response.hold() 和 response.resume()。

  2. 方法是异步的,所需的 return 值是响应。

  3. 响应工具包 (h) 随助手一起提供(而不是 reply() 装饰)。