2015-11-06 52 views
5

答应我使用的是蓝鸟的承诺框架,使POST请求,并获得该POST请求的响应:实施request.postAsync与蓝鸟

var Promise = require('bluebird'); 
var request = Promise.promisifyAll(require('request')); 

// Set the headers 
    var headers = { 
     'User-Agent':  'Super Agent/0.0.1', 
     'Content-Type':  'application/x-www-form-urlencoded' 
    } 

var options = []; 
var scores = []; 

// Configure the request 
options[0] = { 
    url: 'https://api.havenondemand.com/1/api/sync/analyzesentiment/v1', 
    method: 'POST', 
    headers: headers, 
    form: {'apikey': 'XXXXXXXXXXX', 'text': 'I love dogs'} 
} 

// Start the request 
request.postAsync(options[0]).spread(function(response, body) { 
    if (response.statusCode == 200) { 
    var answer = JSON.parse(body); 
    scores[0] = answer['aggregate']['score']; 
    } 
}).then(function() { console.log(scores[0]) }); 

这是我收到错误消息:

Unhandled rejection TypeError: expecting an array or an iterable object but got [object Null] 
    at apiRejection (/Users/vphuvan/demos/node_modules/bluebird/js/release/promise.js:10:27) 
    etc. 

我需要做些什么来解决这个错误信息?

注:我目前使用的蓝鸟的版本是3.0.5

回答

1

这是问题的解答:使用“请求承诺”的框架。我正在使用[email protected],它基于[email protected]。显然,一些无证发生[email protected][email protected]之间

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

// Set the headers 
var headers = { 
    'User-Agent':  'Super Agent/0.0.1', 
    'Content-Type':  'application/x-www-form-urlencoded' 
} 

var options = []; 
var scores = []; 
var text = 'I love dogs'; 

// Configure the request 
options[0] = { 
    url: 'https://api.havenondemand.com/1/api/sync/analyzesentiment/v1', 
    method: 'POST', 
    headers: headers, 
    form: {'apikey': 'XXXXXXXXXX', 'text': text} 
} 

// Start the request 

rp(options[0]) 
    .then(function (body) { 
    // POST succeeded... 
    console.log(body); 
    var answer = JSON.parse(body); 
    scores[0] = answer['aggregate']['score']; 
    }) 
    .then(function() { console.log(scores[0]); }) 
    .catch(function (err) { 
     throw err 
    }); 
+1

尽管如此,我仍然在寻找一个适用于[email protected]的answet。 –

+0

[This](http://stackoverflow.com/a/33764521/682246)应该这样做;)你需要传递'multiArgs:true'。 – Mike

9

你需要设置multiArgs: true在青鸟3.这是在蓝鸟3

promisify API的变化之一以下完整解决方案

var Promise = require('bluebird'); 
var request = Promise.promisifyAll(require('request'), { multiArgs: true }); 

// Set the headers 
    var headers = { 
     'User-Agent':  'Super Agent/0.0.1', 
     'Content-Type':  'application/x-www-form-urlencoded' 
    } 

var options = []; 
var scores = []; 

// Configure the request 
options[0] = { 
    url: 'https://api.havenondemand.com/1/api/sync/analyzesentiment/v1', 
    method: 'POST', 
    headers: headers, 
    form: {'apikey': 'XXXXXXXXXXX', 'text': 'I love dogs'} 
} 

// Start the request 
request.postAsync(options[0]).spread(function(response, body) { 
    if (response.statusCode == 200) { 
    var answer = JSON.parse(body); 
    scores[0] = answer['aggregate']['score']; 
    } 
}).then(function() { console.log(scores[0]) });