2015-02-08 124 views
1

我使用NPM請求節點JS使用數據從請求/請求API調用返回

在這裏使節點API調用一些基本的示例代碼

request = require('request'); 

ApiRequest = function (options) { 
    this.uri = 'http://sampleapi.com/' + options.path, 
    this.method = options.method, 
    this.json = options.json 
}; 

ApiRequest.prototype.call = function() { 
    request(this, function (error, response, body) { 
     if (body) { 
      console.log(body); 
     } else { 
      console.log(error || "There was a problem placing your request") 
     } 
    }); 
}; 

exports.startApiCall = function() { 
    options = { 
     path: 'available', 
     method: 'GET' 
    }; 
    var myRequest = new Request(options); 
    myRequest.call(); 
}; 

當我在調用呼叫() ApiRequest原型唯一的想法,我似乎能夠做的就像控制檯登錄輸出,我相信如果我使用的數據庫,我將能夠插入它。我希望調用函數將結果的一個對象返回給從(exports.startApiCall)調用的地方,以便我可以重新使用該函數,因爲有時我想要控制檯記錄它,有時使用它來構建不同的調用。

我試圖從請求中返回正文,返回請求的自我給了我一個沒有正文的巨大對象。我也嘗試將body設置爲一個變量,並將其返回到函數的底部。如何注意似乎正在工作。

在此先感謝!

+0

您將需要使用回調函數創建一個異步接口,該回調函數可以在操作完成時通知調用方以及結果是什麼。您可以使用普通回調或承諾。 – jfriend00 2015-02-08 08:09:01

+0

你正在隱藏你的startApiCall中的請求變量...將它重命名爲其他東西 - 'var r = new Request(options)' – lujcon 2015-02-08 08:10:34

+0

我試圖讓它成爲一個回調函數,但我似乎無法將它返回,因爲它只是返回了與身體無關的請求的值。我將如何執行promises @ jfriend00? – chrishillonline 2015-02-08 08:42:54

回答

0

您有可變的名稱衝突。將你的本地請求變量重命名爲別的東西。例如:

request = require('request'); 

Request = function (options) { 
    this.uri = 'http://sampleapi.com/' + options.path, 
    this.method = options.method, 
    this.json = options.json 
}; 

Request.prototype.call = function (callback) { 
    request(this, function (error, response, body) { 
     if (body) { 
      callback(error, body) 
     } else { 
      console.log(error || "There was a problem placing your request"); 
      callback(error); 
     } 
    }); 
}; 

exports.startApiCall = function (callback) { 
    options = { 
     path: 'available', 
     method: 'GET' 
    }; 
    var myRequest = new Request(options); 
    myRequest.call(function(error, body) { 
     //check the error and body here; 
     //do the logic 
     //you can also pass it through to the caller 
     callback && callback(error, body); 
    }); 
}; 

當你消耗你的模塊(可以將其命名爲mymodule),你可以這樣做:

var my = require('mymodule'); 
my.startApiCall(function(error, body){ 
    //do something with body 
}); 

如果你不想讓消費者有錯誤和/或身體直接,你可以玩刪除回調參數:

exports.startApiCall = function() { 
    options = { 
     path: 'available', 
     method: 'GET' 
    }; 
    var myRequest = new Request(options); 
    myRequest.call(function(error, body) { 
     //check the error and body here; 
     //do the logic 
     //you can also pass it through to the caller 
    }); 
}; 
+0

我認爲這個問題的主要觀點是如何從請求中獲得結果,而不是你沒有解決的api調用函數。 – jfriend00 2015-02-08 08:26:55

+0

是的,我犯了一個小錯誤,因爲我重命名了這些變量,使它們更具通用性,因爲它們對於調用的內容非常具體。 – chrishillonline 2015-02-08 08:30:46

+0

你喜歡這種模式嗎?如果沒有 - 我可以爲您提供基於承諾的解決方案。 – lujcon 2015-02-08 08:54:34