使用CommonJS / NodeJS javascript创建可导出的对象或模块以包装第三方库

时间:2011-04-28 00:21:07

标签: javascript module node.js export twilio

我是JavaScript新手并创建类/对象。我试图用一些简单的方法包装一个开源库的代码,供我在我的路线中使用。

我有以下代码直接来自source(sjwalter的Github回购;感谢Stephen为图书馆!)。

我正在尝试将文件/模块导出到我的主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);
            }
        });
    });
}

});`

1 个答案:

答案 0 :(得分:2)

只需在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。您可以变得更加漂亮并创建一个队列,该队列存储所有要发送的消息,直到对象初始化为止,然后将em'全部发送出去。

这只是一种让你入门的懒惰方法。要使用上面包装器导出的函数,只需将其包含在其他js文件中即可。 send函数在闭包中捕获所需的所有内容(initializedphone变量),因此您不必担心导出每个依赖项。这是一个使用上述文件的例子。

应用/ mytwilio-test.js

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

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

如果您不想包含mytwilio.js的完整/相对路径,请将其添加到路径列表中。阅读有关模块系统的more,以及Node.JS中模块解析的工作原理。