2017-09-11 15 views
0

こんにちは私はエクスプレスレストウェブサービスに取り組んでいます。私はrequest-promiseを使用して1つのURLを呼び出しています。私は応答を処理してクライアントに戻したいと思います。エクスプレスノードjs Webサービスでサーバの応答が空です

しかし、私は常に空の応答を返すことがわかります。私が約束していることは何ですか?応答をうまく返すrpを使ってWebサービスを呼び出す応答をデバッグしました。

const express = require("express"); 
const router = express.Router(); 
var rp = require("request-promise"); 
const cheerio = require("cheerio"); 
const { rollbar } = require("../config/rollbar"); 
const { baseUrl } = require("../config/settings"); 

/** API to get all currency price */ 
router.get("/:ticker?", function(req, res, next) { 
    var currencyList = []; 

    // it can be null as ticker is optional parameter 
    let reqCurrencyName = req.params.ticker; 

    const promise = Promise.resolve(
    rp(baseUrl, function(error, response, body) { 
     // if no error and http response code is 200 
     if (!error && response.statusCode == 200) { 
     const $ = cheerio.load(body); 
     $("tr").each(function name(i, elem) { 
      // currency name 
      var currencyName = $(this) 
      .find("td") 
      .eq(1) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim(); 

      // market cap value 
      var marketCap = $(this) 
      .find("td") 
      .eq(2) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim(); 

      // currency price 
      var price = $(this) 
      .find("td") 
      .eq(3) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim(); 

      // date supply value 
      var dataSupply = $(this) 
      .find("td") 
      .eq(4) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim() 
      .replace(/ /g, ""); 

      // volume value 
      var volume = $(this) 
      .find("td") 
      .eq(5) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim(); 

      // negative change value 
      var negativeChange = $(this) 
      .find("td") 
      .eq(6) 
      .text() 
      .replace(/\r?\n|\r/g, " ") 
      .trim(); 

      // first item is empty in response so lets not push it into an array 
      if (currencyName !== "") { 
      if (reqCurrencyName !== undefined) { 
       if (currencyName === reqCurrencyName) { 
       const currencyItem = { 
        currencyName: currencyName, 
        marketCap: marketCap, 
        price: price, 
        dataSupply: dataSupply, 
        volume: volume, 
        negativeChange: negativeChange 
       }; 

       currencyList.push(currencyItem); 
       } 
      } else { 
       const currencyItem = { 
       currencyName: currencyName, 
       marketCap: marketCap, 
       price: price, 
       dataSupply: dataSupply, 
       volume: volume, 
       negativeChange: negativeChange 
       }; 

       currencyList.push(currencyItem); 
      } 
      } 
     }); 
     } else rollbar.rollbar.l(error); 
    }) 
); 

    Promise.all(promise).then(data => { 
    res.send(data); 
    }); 
}); 

module.exports = router; 

答えて

2

request-promiseあなたは非同期呼び出しの結果を取得するためにコールバックを使用してはならない、約束を返します。 Promise.resolveを使用して約束を作成するのではなく、rpから約束を作成し、thenコールバックを使用して結果を取得し、catchコールバックを使用してエラーを処理する必要があります。

1つの非同期操作しか実行しないので、そこにはPromise.allは必要ありません。応答ステータスは、デフォルトでは、2xxのではない場合

const express = require("express"); 
const router = express.Router(); 
var rp = require("request-promise"); 
const cheerio = require("cheerio"); 
const { rollbar } = require("../config/rollbar"); 
const { baseUrl } = require("../config/settings"); 

/** API to get all currency price */ 
router.get("/:ticker?", (req, res, next) => { 
    var currencyList = []; 

    // it can be null as ticker is optional parameter 
    let reqCurrencyName = req.params.ticker; 

    rp(baseUrl) 
    .then(body => { 
     const $ = cheerio.load(body); 
     // Ppocessing... 
    }) 
    .then(data => res.send(data)) 
    .catch(err => { 
     rollbar.rollbar.l(err); 
     res.send({ error: err }) 
    }); 
}); 

module.exports = router; 

ところで、request-promiseでエラーが発生します。したがって、コード内の応答ステータスを検証するべきではありません。

+0

私は 'Promise.resolve'と' Promise.all'を使うべきですか? –

+0

複数の約束が完了するのを待つ場合は、 'Promise.all'を使用してください。 'Promise.resolve'は、プロミスチェーンを作成し、チェーン内の最初の実行関数が非同期ではない場合(たとえば、エラーをスローする可能性のある検証関数)に便利です。 – alexmac

+0

よろしいですか。だからここですでに私のための約束チェーンを作り出しているのですか? –

関連する問題