Создайте экспортируемый объект или модуль для обертывания сторонней библиотеки с помощью javascript CommonJS/NodeJS.

Я новичок в JavaScript и создаю классы/объекты. Я пытаюсь обернуть код библиотеки с открытым исходным кодом некоторыми простыми методами, которые я могу использовать в своих маршрутах.

У меня есть приведенный ниже код, который взят прямо из source (репозиторий sjwalter на Github; спасибо Стивену за библиотеку !).

Я пытаюсь экспортировать файл/модуль в свой основной файл app/server.js примерно так:

var twilio = require('nameOfMyTwilioLibraryModule');

или что мне нужно сделать.

Я хочу создать такие методы, как twilio.send(number, message), которые я могу легко использовать в своих маршрутах, чтобы мой код был модульным. Я пробовал несколько разных способов, но ничего не смог заставить работать. Возможно, это не очень хороший вопрос, потому что вам нужно знать, как работает библиотека (и Twilio тоже). Строка var phone = client.getPhoneNumber(creds.outgoing); гарантирует, что мой исходящий номер является зарегистрированным/оплаченным номером.

Вот полный пример, который я пытаюсь обернуть своими методами:

var TwilioClient = require('twilio').Client,
Twiml = require('twilio').Twiml,
creds = require('./twilio_creds').Credentials,
client = new TwilioClient(creds.sid, creds.authToken, creds.hostname),
// Our numbers list. Add more numbers here and they'll get the message
numbers = ['+numbersToSendTo'],
message = '',
numSent = 0;

var phone = client.getPhoneNumber(creds.outgoing);
phone.setup(function() {

for(var i = 0; i < numbers.length; i++) {
    phone.sendSms(numbers[i], message, null, function(sms) {
        sms.on('processed', function(reqParams, response) {
            console.log('Message processed, request params follow');
            console.log(reqParams);
            numSent += 1;
            if(numSent == numToSend) {
                process.exit(0);
            }
        });
    });
}

});`


person JohnAllen    schedule 28.04.2011    source источник


Ответы (1)


Просто добавьте функции, которые вы хотите предоставить в качестве свойств объекта exports. Предполагая, что ваш файл был назван mytwilio.js и сохранен под app/ и выглядит так,

приложение/mytwilio.js

var twilio = require('twilio');
var TwilioClient = twilio.Client;
var Twiml = twilio.Twiml;
var creds = require('./twilio_creds').Credentials;
var client = new TwilioClient(creds.sid, creds.authToken, creds.hostname);

// keeps track of whether the phone object
// has been populated or not.
var initialized = false;
var phone = client.getPhoneNumber(creds.outgoing);
phone.setup(function() {
    // phone object has been populated
    initialized = true;
});

exports.send = function(number, message, callback) {
    // ignore request and throw if not initialized
    if (!initialized) {
        throw new Error("Patience! We are init'ing");
    }
    // otherwise process request and send SMS
    phone.sendSms(number, message, null, function(sms) {
        sms.on('processed', callback);
    });
};

Этот файл в основном идентичен тому, что у вас уже есть, с одним существенным отличием. Он запоминает, был ли объект phone инициализирован или нет. Если он не был инициализирован, он просто выдает ошибку при вызове send. В противном случае он продолжает отправку SMS. Вы можете поизобретать и создать очередь, в которой хранятся все сообщения, для отправки, до тех пор, пока объект не будет инициализирован, а затем все сообщения будут отправлены позже.

Это просто ленивый подход, чтобы вы начали. Чтобы использовать функции, экспортированные вышеуказанной оболочкой, просто включите их в другие файлы js. Функция send захватывает все, что ей нужно (переменные initialized и phone), в замыкании, поэтому вам не нужно беспокоиться об экспорте каждой отдельной зависимости. Вот пример файла, который использует вышеизложенное.

приложение/mytwilio-test.js

var twilio = require("./mytwilio");

twilio.send("+123456789", "Hello there!", function(reqParams, response) {
    // do something absolutely crazy with the arguments
});

Если вы не хотите включать полный/относительный путь mytwilio.js, добавьте его в список путей. Прочтите дополнительные сведения о системе модулей и о том, как работает разрешение модулей в Node. .JS.

person Anurag    schedule 28.04.2011
comment
Спасибо, Анураг! В обратном вызове внизу вашего ответа, что такое reqParams? Я понимаю обычные аргументы обратного вызова HTTP, но для чего они нужны в этом примере? - person JohnAllen; 28.04.2011
comment
@John - это тот же обратный вызов из вашего примера (sms.on('processed', function(reqParams, response) ..), который может быть предоставлен клиентами оболочки для обеспечения гибкости. Это часть события processed, которое эта библиотека генерирует после отправки SMS. Глядя на эту строку в исходном коде, следует что reqParams — это тело запроса, а response — объект Twiml.Response. - person Anurag; 28.04.2011