2016-11-25 11 views
0

私はrequest-promise node moduleを使用しています。私はドキュメントを以下の、と私はすべてを正しく設定しているべきだと考えてきた、しかし、私は次のエラーを取得しています:ノード内の要求の約束が期待通りに機能しない

Unhandled rejection StatusCodeError: 400 - "{\n \"error\" : {\n
\"status\" : 400,\n \"message\" : \"invalid 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) 
    }); 

EDIT

は、これは正しいアプローチですか?

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

答えて

0

それは、そのようなあなたのforループのような場所のカップルにrequestあたかもあなたはrpを呼んでいます。これらの呼び出しの戻り値で何もしていないので、これらの約束を却下したり拒否したりすることはないため、処理しなかった拒否があることを警告するエラーが表示されます。

あなたが行う呼び出しでは、返される値が正しく表示されません。あなたが渡しているコールバックは、NodeJSコールバックスタイルの引数リストを宣言しますが、これは約束が働く方法ではありません。 1つのコールバックにエラーまたはnullが最初の引数として渡されるのではなく、個別のコールバックを解決(成功)および拒否(エラー)として登録します。

the request-promise pageの例題を詳しく検討することをお勧めします。あなたのフォローアップの再


Is this the correct approach?

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

いいえ、まだ拒否を処理しません。これらの2つのリクエストを直列で(並列ではなく)実行することを目標とする場合は、コメントを参照してください。

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

私はこの動作の仕組みを理解するためには改善が必要だと思います。前の関数が応答を返すまで、 'then'関数がトリガーしない印象を受けました。 –

+0

@phantom:' then'を渡すコールバックは、約束が解決されるか、拒否されるまで呼び出されません。より具体的には: 'then'の最初の引数として渡すコールバックは、/約束が解決されたときにのみ呼び出されます。 2番目の引数として2番目のコールバックを渡すと、約束が拒否されない限り、/は呼び出されません。 'catch'の唯一の引数として渡すコールバックは、' then'の第2引数のようなものです。これは、約束が拒否されたときにのみ呼び出されます。 –

+0

@tj私は自分の質問を更新しました。それは動作するようです。あなたがここの上司であるため、これが正しいアプローチであることを確認できますか:-)? –

関連する問題