2014-09-24 104 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); 
    });