13

使用 Hapi v17,我只是想制作一个简单的 Web 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)

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

4

3 回答 3

24

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

https://hapijs.com/api/17.1.0

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

//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()返回一个 Promise,它可以用来验证服务器是否正确启动。

我相信这个新的 API 旨在与async-await语法一起使用。

于 2017-11-25T19:27:32.487 回答
2

要解决此问题,您只需替换return reply('hello world');return 'hello world'; 以下描述:

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

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

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

  3. 响应工具包 (h) 提供了助手(而不是 reply() 装饰)。
于 2018-01-22T04:48:20.143 回答
0

看来您的代码中有重复项:

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();
于 2017-11-25T14:00:23.533 回答