Javascript 如何在Hapi.js中正确注册插件

Javascript 如何在Hapi.js中正确注册插件,javascript,node.js,plugins,hapijs,Javascript,Node.js,Plugins,Hapijs,我在hapi的官方网站上尝试了一个简单的服务器,但失败了:我无法注册插件 var Hapi = require('hapi'); var server = new Hapi.Server(); server.connection({port: 4004}); server.register([require('inert'), require('vision')], (err) => { if (err) { throw err; } ser

我在hapi的官方网站上尝试了一个简单的服务器,但失败了:我无法注册插件

var Hapi = require('hapi');

var server = new Hapi.Server();

server.connection({port: 4004});

server.register([require('inert'), require('vision')], (err) => {
    if (err) {
        throw err;
    }

    server.start(err => {
        console.log('server started');
    });
});
这是一个愚蠢的错误:

/Users/apple/Documents/node_projects/hapijon/testjon/ch4_routes_and_handlers/node_modules/hapi/lib/plugin.js:219
        if (plugin.register.register) {                             // Required plugin
                            ^

TypeError: Cannot read property 'register' of undefined
    at module.exports.internals.Server.internals.Plugin.register (/Users/apple/Documents/node_projects/hapijon/testjon/ch4_routes_and_handlers/node_modules/hapi/lib/plugin.js:219:29)
    at Object.<anonymous> (/Users/apple/Documents/node_projects/hapijon/testjon/ch4_routes_and_handlers/tess.js:7:8)
    at Module._compile (module.js:635:30)
    at Object.Module._extensions..js (module.js:646:10)
    at Module.load (module.js:554:32)
    at tryModuleLoad (module.js:497:12)
    at Function.Module._load (module.js:489:3)
    at Function.Module.runMain (module.js:676:10)
    at startup (bootstrap_node.js:187:16)
    at bootstrap_node.js:608:3

我会将hapi的版本升级到最新版本,这两个插件的版本似乎只适用于最新版本的hapi。

根据v17文档:

等待服务器。注册(插件,[选项])

在以下位置注册插件:

  • 插件-一个或一组:

    • a
    • 具有以下内容的对象:
      • 插件
        -插件对象
      • 选项
        -(可选)注册期间传递给插件的选项
      • 一次
        路由
        -(可选)插件特定的注册选项,定义如下
  • 选项-(可选)注册选项(不同于传递给注册函数的选项):

    • 一次
      -如果
      为true
      ,则跳过同一插件的后续注册,不会出现错误。不能与插件选项一起使用。默认为
      false
      。如果未设置为
      true
      ,则第二次出现错误时将抛出错误 插件已在服务器上注册
    • 路由
      -应用于插件添加的每条路由的修饰符:
      • 前缀
        -作为前缀添加到任何路由路径的字符串(必须以
        “/”开头
        )。如果一个插件注册了一个子插件,
        前缀是
        传递给子对象或添加到子对象的前面
        前缀
      • vhost
        -应用于每个路由的虚拟主机字符串(或字符串数组)。最外层的
        vhost
        覆盖任何嵌套配置
返回值:无

插件对象是具有以下属性的对象:

  • 注册
    -(必需)注册功能与签名
    异步功能(服务器,选项)
    其中:

    • server-具有特定于插件的服务器对象
      server.realm`
    • options
      -在注册期间通过
      server.register()传递给插件的任何选项
  • name
    -(必需)插件名称字符串。该名称用作唯一键。已发布的插件(例如,在npm注册表中发布) 应使用与其“package.json”中的名称字段相同的名称 文件每个应用程序中的名称必须是唯一的

  • version
    -(可选)插件版本字符串。该版本仅用于使其他插件能够找到版本的信息 加载。版本应与中指定的版本相同 插件的“package.json”文件

  • multiple
    -(可选)如果
    true
    ,则允许在同一服务器上多次注册插件。默认值为
    false

  • 依赖关系
    -(可选)表示插件依赖关系的字符串或字符串数组。与通过设置依赖项相同
    server.dependency()

  • once
    -(可选)如果
    true
    ,则每个服务器只注册一次插件。如果设置,将覆盖传递给的
    选项一次
    server.register()
    。默认为无覆盖

因此,对于您的用法,请尝试:

const Inert = require('inert');
const Vision = require('vision');
await server.register([Inert.plugin, Vision.plugin]);

这个问题的回答是否令您满意?如果是,请您将下面的一个答案标记为已接受答案?谢谢
const Inert = require('inert');
const Vision = require('vision');
await server.register([Inert.plugin, Vision.plugin]);