2016-06-11 12 views
2

REST APIを使いやすくするための最初のnode.jsパッケージを作成しています。パッケージを使用している人が以下を実行できるようにパッケージをフォーマットする際に問題があります。それらのアプリケーション。私の現在の設定でNPMパッケージのセットアップを書く方法

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_token変数を設定する前に、非同期の性質がユーザーファイルの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; 

:ここ

は私のパッケージには、次のようになります。私はそのスタイルに設定されていませんが、ユーザーが理解して使用するのが最も簡単なようです。

これを修正する唯一の方法は、ウォーター({})にコールバックを追加することですが、コールバックにすべての水関連コードをラップさせるという混乱を招くことになります。例えば、Twitterパッケージを見ることでそれができるのは分かっていますが、私はまだ彼らのやり方について心を抱くことができます。どんな助けでも感謝します、ありがとう。

+0

'ノードtwitter'パッケージは、いずれかを作るようには見えません。これを使用するには

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; 

をプロトタイプ関数内の非同期リクエスト – gnerkus

+1

多分、私は自分のベアラトークンを提供し、セットアップで休憩要求をしないようにしなければなりません。しかし、私は、彼らがパッケージを使いやすくするためのトークンを手に入れておくことで助けになることを望んでいます。 –

答えて

1

トークンを取得する責任を委任する必要があります。こうすることで、パッケージは即座に初期化されます。より効率的にするために、トークンを最初にフェッチするときにトークンをキャッシュすることができます。私はここで例を作ったが、あなたは、非同期のようなもの使用してそれを片付けることができます:

var Water = require('water-reservation'); 

var water = new Water({ 
    username: 'username', 
    password: 'pass', 
    api_url: 'http://example.com' 
}); 

water.get_water(function (err, res) { 

}); 
+0

クール、ソリューションとサンプルありがとう!だから私がこのパッケージで作ったすべての関数に対して、 'this.get_bearer_token(function(err、token){};)を取得するためのコールバックを含める必要があります。'すべてのメソッドで同じコールバックを繰り返さないようにする方法があるのだろうか?読みやすさを高め、冗長性を減らすことができます。 –

+0

ネストされたコールバックを回避するには、非同期の滝(または約束)を使用して扁平にすることができます。しかし、それが単にベアラトークンを取得してから要求を出すのであれば、おそらく私は気にしません。 – MrWillihog

関連する問題