2016-05-12 2 views
-1

私は私のウェブサイトの1つにログインすることを約束しました。NodeJSプロミスは決して3番目のthen()のコールには達しません

マイコード:

var Promise = require('promise'); 
function login(user, pass){ 
    return new Promise(function (fulfill, reject){ 
     var options = { 
      url: 'https://url.com/this', 
      method: 'GET', 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://google.com/page' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      fulfill(body); 
     }); 
    }).then(function(html){ 
     var parsed = parseForm(html); 
     parsed['post_user_name'] = user; 
     parsed['post_user_pass'] = pass; 
     return parsed; 
    }).then(function(cred){ 
     var query = querystring.stringify(cred); 
     var options = { 
      url: 'https://url.com/next', 
      method: 'POST', 
      form: query, 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://google.com/this' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      return 'gonext'; 
     }); 
    }).then(function(success){ 
     query = querystring.stringify(cred); 
     options = { 
      url: 'https://url.com/loggedin', 
      method: 'GET', 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://google.com/loggedin' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      return 'go again'; 
     }); 
    }).then(function(success){ 
     console.log('here'); 
     query = querystring.stringify(cred); 
     options = { 
      url: 'https://url.com/myaccount', 
      method: 'GET', 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://google.com/account' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      fs.writeFile('text.txt', body); 
      return parseAuths(body); 
     }); 
    }); 
} 

私の問題は:約束は、第三then()機能に達することはありません。

同様に、すべてのリクエストコールを1つのコードに書き込んでthen()に送信し、次に必要なデータを次に転送しようとすると、そこには届きません。

function login(user, pass){ 
    return new Promise(function (fulfill, reject){ 
     var options = { 
      url: 'https://url.com/this', 
      method: 'GET', 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://url.com/' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      fulfill(body); 
     }); 
    }).then(function(html){ 
     var parsed = parseForm(html); 
     parsed['post_user_name'] = user; 
     parsed['post_user_pass'] = pass; 
     return parsed; 
    }).then(function(cred){ 
     var query = querystring.stringify(cred); 
     var options = { 
      url: 'https://url.com/that', 
      method: 'POST', 
      form: query, 
      headers: { 
       'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
       'Referer': 'https://url.com/this' 
      } 
     }; 
     request(options, function(err,httpResponse,body){ 
      query = querystring.stringify(cred); 
      options = { 
       url: 'https://url.com/another', 
       method: 'GET', 
       headers: { 
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
        'Referer': 'https://url.com/that' 
       } 
      }; 
      request(options, function(err,httpResponse,body){ 
       query = querystring.stringify(cred); 
       options = { 
        url: 'https://url.com/account', 
        method: 'GET', 
        headers: { 
         'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
         'Referer': 'https://url.com/another' 
        } 
       }; 
       request(options, function(err,httpResponse,body){ 
        fs.writeFile('text.txt', body); 
        return parseAuths(body); 
       }); 
      }); 
     }); 
    }).then(function(data){ 
     console.log(data); // Never reaches this 
    }); 
} 

私の質問:私は何も露骨に間違っているのでしょうか?私が紛失しているものはありますか?

+0

parseFormの外観は? – Shaun

+0

それは最初の 'then()'にあります。それはそれを通ります。 – Derek

+0

あなたは[request-promise](https://npmjs.com/package/request-promise)を使用して、 。また、同じスコープ内にあるときは、オプションの再割り当てを続けます。 – peteb

答えて

1

このアプローチでは、request-promiseを使用しています。あなたは、あなたのすべての要求を約束し、チェーンをそのまま維持することができます。エラーが発生した場合は、正しくcatch()に伝播されます。

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


function login(user, pass) { 
    var options = { 
     url: 'https://url.com/this', 
     method: 'GET', 
     headers: { 
      'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
      'Referer': 'https://google.com/page' 
     } 
    }; 

    return rp(options) 
     .then(function(html){ 
      var parsed = parseForm(html); 
      parsed['post_user_name'] = user; 
      parsed['post_user_pass'] = pass; 
      return parsed; 
     }).then(function(cred){ 
      var query = querystring.stringify(cred); 
      var opts = { 
       url: 'https://url.com/next', 
       method: 'POST', 
       form: query, 
       headers: { 
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
        'Referer': 'https://google.com/this' 
       } 
      }; 
      return rp(opts); 
     }).then(function(success){ 
      var query = querystring.stringify(cred); 
      var opts = { 
       url: 'https://url.com/loggedin', 
       method: 'GET', 
       headers: { 
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
        'Referer': 'https://google.com/loggedin' 
       } 
      }; 
      return rp(opts); 
     }).then(function(success){ 
      console.log('here'); 
      var query = querystring.stringify(cred); 
      var opts = { 
       url: 'https://url.com/myaccount', 
       method: 'GET', 
       headers: { 
        'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
        'Referer': 'https://google.com/account' 
       } 
      }; 

      return rp(opts); 
     }) 
     .then(function(body) { 
      fs.writeFile('text.txt', body); 
      return parseAuths(body); 
     }) 
     .catch(function(err) { 
      // Handle any errors; 
      console.log(err); 
     });   
    } 
-2

then関数から約束を返す必要があります。また、要求コールバックで返されたエラーもキャッチする必要があります。これを試してください:

}).then(function(success){ 
    query = querystring.stringify(cred); 
    options = { 
     url: 'https://url.com/loggedin', 
     method: 'GET', 
     headers: { 
      'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0', 
      'Referer': 'https://google.com/loggedin' 
     } 
    }; 
    // Need to return a promise 
    return new Promise(function(resolve,reject) { 
     request(options, function(err,httpResponse,body){ 
      if (err) { return reject(err); } 
      return resolve('go again'); 
     }); 
    }); 
+1

これは約束のアンチパターンです。 – Derek

+1

@IceManちょうど[ブルーバードのドキュメントを参照](http://bluebirdjs.com/docs/anti-patterns.html)、Downvotedと言います。 – peteb

+0

request()が約束を返した場合、それから直接戻ることができます。プロミスライブラリがサポートしている場合は、promisifyを使用できます。さもなければ、これは約束の連鎖を続ける方法です。 – Shaun

関連する問題