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

How to call Hapi plugin function from another

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

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

'use strict';

const Nodemailer = require('nodemailer');

exports.plugin = {
    name: 'mailerWrapperPlugin',
    version: '0.0.1',
    register: async function (server, options) {
    }
}; 

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

我发现 Hapi 文档有点稀疏,尤其是与插件相关的文档。

因此,例如,如果我的 Nodemailer 包装器有一个 sendMail() 函数,我将如何在我编写的另一个插件中使用它?

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

您可以使用 server.methods 对象。文档说:

Server methods are functions registered with the server and used throughout the application as a common utility. Their advantage is in the ability to configure them to use the built-in cache and share across multiple request handlers without having to create a common module.

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

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 对象。它的文档说:

Extends various framework interfaces with custom methods where:

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