节点中的请求承诺未按预期工作

时间:2016-11-25 15:17:33

标签: javascript node.js request promise

我正在使用request-promise node module。我一直在关注文档,并且相信我应该正确设置一切,但是,我收到以下错误:

  

未处理拒绝StatusCodeError:400 - “{\ n \”错误\“:{\ n
  \“status \”:400,\ n \“message \”:\“无效ID \”\ n} \ n}“       at new StatusCodeError(/Users/fitz035/Desktop/sony/travelLand/node_modules/request-promise/node_modules/request-promise-core/lib/errors.js:32:15)

我的代码如下所示。

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

rp('apiOne' + mood)
  .then(function(error, response, body) {
    console.log(body)
    }
  }).then(function(error) {
    for (var i = 0; i < array; i++) {
      rp('apiTwo', function(error, response, body) {
        console.log(body))
      });
    }
  }).then(function(error, response, body) {
    rp('apiThree' + songListUrl, function(error, response, body) {
      console.log(body))
    });
  })
  .catch(function(err) {
    console.log(err)
  });

修改

这是正确的方法吗?

var options = {
    uri: 'https://jsonplaceholder.typicode.com/posts/1',
    json: true
}

rp(options).then(function(data){
    console.log(data)
    var optionsTwo = {
        uri: 'http://www.google.com',
    }

    rp(optionsTwo).then(function(data){
        console.log(data)
        console.log(answer);
    })
})

1 个答案:

答案 0 :(得分:1)

您在几个地方(例如rp循环中)呼叫request,就好像它是for一样。由于您没有对这些调用的返回值执行任何操作,因此您不会处理解决方案或拒绝这些承诺,因此会收到错误警告您存在您未处理的拒绝。

您使用返回值的调用看起来也不正确。您传入的回调声明了NodeJS回调样式参数列表,但这不是Promises的工作方式。而不是传递错误或作为第一个参数的null的单个回调,而是注册单独的回调以解决(成功)和拒绝(错误)。

我建议详细研究the request-promise page上的示例。

重新开始跟进:

  

这是正确的方法吗?

var options = {
    uri: 'https://jsonplaceholder.typicode.com/posts/1',
    json: true
}

rp(options).then(function(data){
    console.log(data)
    var optionsTwo = {
        uri: 'http://www.google.com',
    }

    rp(optionsTwo).then(function(data){
        console.log(data)
        console.log(answer);
    })
})

不,那仍然没有处理拒绝。如果您的目标是串行执行这两个请求(不是并行),那么请参阅注释:

var options = {
    uri: 'https://jsonplaceholder.typicode.com/posts/1',
    json: true
};

rp(options)
    .then(function(data){
        console.log(data)
        var optionsTwo = {
            uri: 'http://www.google.com'
        };

        return rp(optionsTwo).then(function(data){ // Note the return
            console.log(data)
            console.log(answer);                   // Don't know where `answer` is coming from...?
            // Note that by not returning anything, you convert
            // the resolution value to `undefined`. That's fine if
            // you don't need it, but it's worth pointing out.
        });
    })
    .catch(function(error) {
        // One of the two operations above failed
    });