ExpressJS爬虫API获取数据后始终返回500状态码求助
问题分析与解决
核心问题:变量名冲突
你在try块中使用const res = await axios.get(...),这里的res变量覆盖了Express路由回调函数的res参数(即Express的响应对象)。当后续执行res.status(200).json(data)时,此时的res已经是axios的响应对象,而非Express的响应对象,因此会触发异常,进入catch块返回500状态码。
修正后的代码
const router = require("express").Router(); const axios = require("axios"); const cheerio = require("cheerio"); router.get("/:id", async (req, res) => { const currency = req.params.id; try { // 将axios响应变量名改为axiosRes,避免覆盖Express的res const axiosRes = await axios.get( `https://coinmarketcap.com/currencies/${currency}/` ); const html = axiosRes.data; var $ = cheerio.load(html); const price = $(".statsValue").first().text(); const data = { market: Number(price.slice(1).replaceAll(",", "")), }; console.log(data); res.status(200).json(data); } catch (error) { res.status(500).json(error); } }); module.exports = router;
说明
只需要将axios请求返回的结果变量名从res替换为其他名称(比如axiosRes),就能避免变量覆盖问题,此时res.status(200).json(data)调用的是正确的Express响应对象方法,接口就能正常返回200状态码和数据了。
内容的提问来源于stack exchange,提问作者GusiiSenpaii
相关产品推荐
相关产品推荐

