こんにちは私はエクスプレスレストウェブサービスに取り組んでいます。私は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;
私は 'Promise.resolve'と' Promise.all'を使うべきですか? –
複数の約束が完了するのを待つ場合は、 'Promise.all'を使用してください。 'Promise.resolve'は、プロミスチェーンを作成し、チェーン内の最初の実行関数が非同期ではない場合(たとえば、エラーをスローする可能性のある検証関数)に便利です。 – alexmac
よろしいですか。だからここですでに私のための約束チェーンを作り出しているのですか? –