如何编写一个NPM包的设置

我正在编写我的第一个node.js包,以帮助使REST API更易于使用,而且我无法格式化该包以允许使用该包的人在其应用程序中执行下面的操作。

var Water= require("water-reservation"); var water = Water({username: myusername, password: mypassword}); // Problem here because Water({}) needs to do a REST call to get a bearer // token to use the API I am trying to simplify. Thus, it tries to // get_water(callabck) before the bearer_token var is set in my package. water.get_water(function(err, result){ if(err){ console.log(err); console.log("----------------------------------------------"); } else{ console.log(result); console.log("----------------------------------------------"); } }); 

在我目前的设置中,我将用户的用户名和密码传递给REST端点,以获取我在所有REST调用中使用的不记名令牌。 在我完成在我的包中设置bearer_tokenvariables之前,asynchronous性质将在用户文件中调用get_water。

这是我的包看起来像:

 var request = require('request'); var bearer_token = ""; var api_url = ""; var Water = function(credentials){ api_url = credentials.api_url; var username = credentials.username; var password = credentials.password; get_bearer_token(username, password, function(err, access_token){ bearer_token = access_token; }); }; function get_bearer_token(username, password, callback){ var request_options = { url: api_url + "/auth", method: "GET", 'auth': { 'user': username, 'pass': password } }; request(request_options, function(err, res, body){ if(err) { return callback("Water Initialization Error: " + err, null); } else { return callback(null, body); } }); } // Get water Water.prototype.get_water = function(callback) { var request_options = { url: api_url + "/water", method: "GET", 'auth': { 'bearer': bearer_token } }; request(request_options, function(err, res, body){ if(err) { return callback(err, null); } else{ return callback(null, body); } }); }; // more package functions... module.exports = Water; 

我试图find一种方法来进行设置,以便用户可以使用上述的包。 我不是那种风格,但它似乎是用户理解和使用的最简单方法。

我唯一能想到解决这个问题的方法是给Water({})添加一个callback函数,但是如果用户在callback函数中包含了所有与水有关的代码,就会造成很多混乱。 我知道这可以通过查看Twitter包来完成,但我仍然可以围绕他们如何做到这一点。 任何帮助将不胜感激,谢谢。

您应该将获取令牌的责任委托给他们发出请求。 这样,软件包立即被初始化。 为了使效率更高,您可以在首次读取令牌时caching该令牌。 我在这里做了一个例子,但你可以用async来清理它:

 var request = require('request'); var Water = function (credentials) { this.api_url = credentials.api_url; this.username = credentials.username; this.password = credentials.password; return this; }; Water.prototype.get_bearer_token = function (callback) { // We already have the bearer token, so return straight away if (this.bearer_token) return callback(null, this.bearer_token); var self = this; var request_options = { url: this.api_url + "/auth", method: "GET", 'auth': { 'user': this.username, 'pass': this.password } }; request(request_options, function(err, res, body){ if(err) { return callback("Water Initialization Error: " + err, null); } else { self.bearer_token = body; return callback(null, body); } }); } // Get water Water.prototype.get_water = function(callback) { var self = this; this.get_bearer_token(function (err, token) { if (err) return callback(err); var request_options = { url: self.api_url + "/water", method: "GET", 'auth': { 'bearer': token } }; request(request_options, function(err, res, body){ if(err) { return callback(err, null); } else{ return callback(null, body); } }); }); }; // more package functions.. module.exports = Water; 

要使用它:

 var Water = require('water-reservation'); var water = new Water({ username: 'username', password: 'pass', api_url: 'http://example.com' }); water.get_water(function (err, res) { });