如何从另一个调用Hapi插件函数

时间:2018-12-10 16:31:25

标签: node.js hapijs

在Hapi(v17,如果有区别的话)中,从另一个调用插件中的函数的正确方法是什么?

假设我已开始围绕Nodemailer编写包装器插件:

ascending_order=arrange[order(arrange)]
Rank_values=rank(ascending_order)

在Hapi中其他地方公开插件功能的正确方法是什么(即,向Hapi实例本身,或者更重要的是,向Hapi加载的其他插件公开)。

我发现Hapi文档很少,尤其是在插件方面。

例如,如果我的Nodemailer包装器具有'use strict'; const Nodemailer = require('nodemailer'); exports.plugin = { name: 'mailerWrapperPlugin', version: '0.0.1', register: async function (server, options) { } }; 函数,我该如何在我编写的另一个插件中使用它?

P.S。我有点像Node.JS / Hapi新手,所以请温柔对待我!我正在对此进行测试,因为我正在考虑从PHP迁移到Hapi,以用于将来的后端应用程序。

1 个答案:

答案 0 :(得分:1)

您可以使用server.methods对象。医生说:

  

服务器方法是向服务器注册并使用的函数   在整个应用程序中作为通用实用程序。他们的优势在于   配置它们以使用内置缓存和共享的能力   跨多个请求处理程序,而无需创建通用的   模块。

现在这是您的第一个插件:

const Nodemailer = require('nodemailer');

exports.plugin = {
    name: 'mailerWrapperPlugin',
    version: '0.0.1',
    register: async function (server, options) {
        server.method('sendMail', (subject, to, body) => {
            // compose and send mail here
        });
    }
};

这是您的第二个,并确保在第一个之后加载。

exports.plugin = {
    name: 'anotherPlugin',
    version: '0.0.1',
    register: async function (server, options) {
        server.methods.sendMail("Hello", "test@test.com", "Sup?");
    }
};

就是这样。

您还可以使用server.decorate对象。它的文档说:

  

使用自定义方法扩展各种框架接口,其中:

server.decorate可以将方法添加到其他一些对象中,例如路由,请求,服务器和响应对象。

如果我们返回您的插件:

exports.plugin = {
    name: 'mailerWrapperPlugin',
    version: '0.0.1',
    register: async function (server, options) {
        server.decorate('server', 'sendMail', (subject, to, body) => {

        });
    }
};

和您的第二个插件,在第一个插件之后加载!

exports.plugin = {
    name: 'anotherPlugin',
    version: '0.0.1',
    register: async function (server, options) {
        server.sendMail("Hello", "test@test.com", "Sup?");
    }
};

它们之间的区别是server.methods对象向server.methods对象添加了自定义字段,但是使用server.decorate可以直接扩展服务器或请求对象。使用对您更清楚的那个,我通常更喜欢server.decorate