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

时间:2018-01-07 05:05:33

标签: 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;
    }

    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

这是我的package.json:

  "dependencies": {
    "accept": "^2.1.4",
    "hapi": "^14.2.0",
    "inert": "^5.0.1",
    "iron": "^5.0.4",
    "vision": "^5.3.0",
    "wreck": "^14.0.2"
  }

2 个答案:

答案 0 :(得分:2)

根据https://hapijs.com/api#server.register()的v17文档:

await server.register(plugins, [options])

  

在以下位置注册插件:

     
      
  • 插件 - 一个或一个数组:

         
        
    • a plugin object
    •   
    • 具有以下内容的对象:      
          
      • plugin - 一个插件对象。
      •   
      • options - (可选)在注册期间传递给插件的选项。
      •   
      • onceroutes - (可选)特定于插件的注册选项,定义如下。
      •   
    •   
  •   
  • 选项 - (可选)注册选项(与传递给注册功能的选项不同):

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

返回值:无。

plugin object是具有以下属性的对象:

  
      
  • register - (必填)注册函数,签名为async function(server, options),其中:

         
        
    • server - the server object with a plugin-specific server.realm`。
    •   
    • options - 通过server.register()注册时传递给插件的所有选项。
    •   
  •   
  • name - (必需)插件名称字符串。该名称用作唯一键。已发布的插件(例如在npm注册表中发布)   应该在'package.json'中使用与name字段相同的名称   文件。每个应用程序中的名称必须是唯一的。

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

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

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

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

  •   

因此,为了您的使用,请尝试:

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

答案 1 :(得分:0)

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