Как вызвать функцию плагина Hapi из другого - PullRequest
0 голосов
/ 10 декабря 2018

В 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).

I'mпоиск документации по Hapi немного скуден, особенно в отношении плагинов.

Так, например, если бы у моей оболочки Nodemailer была функция sendMail(), как бы я сделал это доступным в другом плагине, который я написал?

PS Я новичок в Node.JS / Hapi, так что относитесь ко мне осторожно!Я тестирую это, потому что думаю о переходе с PHP на Hapi для будущих серверных приложений.

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать 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 в целом.

...