Javascript express nodejs web服务中的服务器响应为空
您好,我在express rest Web服务上工作。我正在使用Javascript express nodejs web服务中的服务器响应为空,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,您好,我在express rest Web服务上工作。我正在使用请求承诺调用一个url,我希望处理响应并返回到客户端 但我看到它总是返回空的响应。我在做什么?我使用rp调试了调用webservice的响应,该响应返回良好 const express = require("express"); const router = express.Router(); var rp = require("request-promise"); const cheerio = require("cheerio"
请求承诺
调用一个url,我希望处理响应并返回到客户端
但我看到它总是返回空的响应。我在做什么?我使用rp
调试了调用webservice的响应,该响应返回良好
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
创建已履行的承诺,相反,您需要从rp
创建一个承诺链,然后使用然后使用回调来获得结果,并使用catch
回调来处理可能的错误
您只执行一个异步操作,Promise。所有的都不需要
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;
顺便说一句,默认情况下,如果响应状态不是2xx,请求承诺
将抛出错误。因此,您不应该在代码中验证响应状态。请求承诺
返回承诺,您不应该使用回调来获取异步调用的结果。您不应该使用promise.resolve
创建已履行的承诺,相反,您需要从rp
创建一个承诺链,然后使用然后使用回调来获得结果,并使用catch
回调来处理可能的错误
您只执行一个异步操作,Promise。所有的都不需要
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;
顺便说一句,默认情况下,如果响应状态不是2xx,请求承诺
将抛出错误。因此,您不应该在代码中验证响应状态。我应该在哪里使用Promise.resolve
和Promise.all
?当您要等待多个承诺完成时,您应该使用Promise.all
Promise.resolve
在您想要创建承诺链时非常有用,并且链中第一个运行的函数不是异步的(例如验证函数,它可能会抛出错误)。好的。所以这里它已经为我创建了一个承诺链,对吗?在我的示例中,rp(baseUrl)
创建了一个承诺链。啊,我明白了。我得到了GET/ticker 304 6798.232 ms--在这里我应该使用Promise.resolve
和Promise.all
?你应该使用Promise.all
当你想等待多个承诺完成时Promise.resolve
在您想要创建承诺链时非常有用,并且链中第一个运行的函数不是异步的(例如验证函数,它可能会抛出错误)。好的。所以这里它已经为我创建了一个承诺链,对吗?在我的示例中,rp(baseUrl)
创建了一个承诺链。啊,我明白了。我得到的是GET/ticker 304 6798.232毫秒--