【问题标题】:request-promise in node not working as expected节点中的请求承诺未按预期工作
【发布时间】:2017-04-10 00:49:46
【问题描述】:

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

未处理的拒绝 StatusCodeError: 400 - "{\n \"error\" : {\n
\"status\" : 400,\n \"message\" : \"invalid id\"\n }\n}" 在新的 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);
    })
})

【问题讨论】:

    标签: javascript node.js request promise


    【解决方案1】:

    您在多个地方调用rp 就好像它是request,例如在您的for 循环中。由于您没有对这些调用的返回值做任何事情,因此您没有处理这些承诺的解决或拒绝,因此收到错误警告您有一个您没有处理的拒绝。

    您使用返回值的调用看起来也不正确。您传入的回调声明了 NodeJS 回调样式的参数列表,但这不是 Promise 的工作方式。您可以为解决(成功)和拒绝(错误)注册单独的个回调,而不是传递错误或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);
        })
    })
    

    不,这仍然不能处理拒绝。如果您的目标是串行(而不是并行)执行这两个请求,请参阅 cmets:

    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
        });
    

    【讨论】:

    • 我认为我对其工作原理的核心理解需要改进。我的印象是 then 函数在前一个函数返回响应之前不会触发
    • @phantom: 你传递的回调then 在promise 被解决或拒绝之前不会被调用,是的。更具体地说:您作为第一个参数传递给 then 的回调将仅在/如果承诺得到解决时被调用;如果您将第二个回调作为第二个参数传递,它不会被调用,直到/除非承诺被拒绝。作为catch 的唯一参数传递的回调就像then 的第二个参数一样:它仅在/如果promise 被拒绝时调用。
    • @tj 我已经更新了我的问题。它似乎工作。您能否确认这是正确的方法,因为您是这里的大师 :-)?
    • @phantom: :-) 我已添加到答案中。
    猜你喜欢
    • 2019-01-19
    • 2018-09-19
    • 2019-09-15
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2018-04-24
    相关资源
    最近更新 更多