2014-09-24 72 views
1

我: 我用Node.js的請求模塊獲得授權令牌:與請求承諾更換節點request.post

工作代碼,而無需承諾

var request = require('request'); 
var querystring = require('querystring'); 

var requestOpts = querystring.stringify({ 
    client_id: 'Subtitles', 
    client_secret: 'X............................s=', 
    scope: 'http://api.microsofttranslator.com', 
    grant_type: 'client_credentials' 
}); 

request.post({ 
    encoding: 'utf8', 
    url: "https://datamarket.accesscontrol.windows.net/v2/OAuth2-13", 
    body: requestOpts 
}, function(err, res, body) { //CALLBACK FUNCTION 
    var token = JSON.parse(body).access_token; 
    amkeAsyncCall(token); 
}); 

我想: 獲取該令牌需要一些時間。反過來,我需要從getToken回調makeAsyncCall。所以我決定使用從hererequest-promise

問題:請求承諾似乎根本不適用於我。

相同(不工作)代碼的承諾:

var rp = require('request-promise'); 
    var querystring = require('querystring'); 

    var requestOpts = { 
     encoding: 'utf8', 
     uri: 'https://datamarket.accesscontrol.windows.net/v2/OAuth2-13', 
     method: 'POST', 
     body: querystring.stringify({ 
      client_id: 'Subtitles', 
      client_secret: 'Xv2Oae6Vki4CnYcSF1SxSSBtO1x4rX47zhLUE/OqVds=', 
      scope: 'http://api.microsofttranslator.com', 
      grant_type: 'client_credentials' 
     }) 
    }; 

    rp(requestOpts) 
    .then(function() { 
     console.log(console.dir); 
    }) 
    .catch(function() { 
     console.log(console.dir); 
    }); 
+2

任何承諾庫會做,你不需要一個完整的包。只需使用'bluebird'並執行'Promise.promisify(require(「request」))'就可以了 – 2014-09-24 10:07:22

回答

0

我用Node.js的包 「unirest」。

var unirest = require('unirest'); 
var dataObj = {}; 
var Request = unirest.post('http://127.0.0.1:' + port + '/test/4711DE/de'); 
Request.headers({ 'Accept': 'application/json' })      
.type('json') 
.send(JSON.stringify(dataObj)) 
.auth({ 
    user: 'USERNAME', 
    pass: 'PASSWORD', 
    sendImmediately: true 
}) 
.end(function (response) { 
    assert.equal(200, response.statusCode); 
    // ... 
}); 
1

我的Request-Promise(0.3.1)的最新版本測試你的代碼,它工作正常。

只記錄到控制檯的最後部分是不正確的。使用:

rp(requestOpts) 
    .then(function(body) { 
     console.dir(body); 
    }) 
    .catch(function(reason) { 
     console.dir(reason); 
    });