Node.js中request模块调用BitcoinAverage API致服务器频繁崩溃排查
搞定你的比特币价格API请求问题!
看了你的代码和报错信息,我一下子就找到问题根源了——咱们一步步来解决:
首先,核心问题是Bitcoinaverage的v2 API现在不再允许匿名请求!你收到的报错Unauthenticated requests are not allowed就是明证,这时候API返回的不是你期望的JSON数据,而是一段提示文本,你硬去执行JSON.parse(body)肯定会抛出语法错误,直接导致服务崩溃。
接下来给你具体的解决方案:
第一步:获取API密钥
先去Bitcoinaverage平台注册账号(可以开通免费试用),拿到你的专属API密钥,这是调用他们API的必备凭证。
第二步:修改代码,带上认证并增加容错
你的代码还有几个小问题:比如引入了https模块但根本没用到,反而用了request模块却没在代码开头明确引入(虽然可能已经安装,但最好显式声明);另外完全没做错误处理,一旦请求出问题就直接崩服务。
给你改好的代码:
const express = require("express"); const bodyParser = require("body-parser"); const request = require("request"); // 明确引入request模块,确保已执行npm install request const app = express(); app.use(bodyParser.urlencoded({ extended: true })); app.get("/", function (req, res) { res.sendFile(__dirname + "/index.html"); }); app.post("/", function (req, res) { // 替换成你自己的Bitcoinaverage API密钥 const YOUR_API_KEY = "这里填写你的API密钥"; const requestOptions = { url: "https://apiv2.bitcoinaverage.com/indices/global/ticker/BTCUSD", headers: { "X-ba-key": YOUR_API_KEY // 带上认证请求头 } }; request(requestOptions, function (error, response, body) { // 先处理请求本身的错误(比如网络问题) if (error) { console.log("请求出错啦:", error); return res.status(500).send("获取比特币价格失败,请稍后重试"); } // 检查API返回的状态码,非200则直接返回错误信息 if (response.statusCode !== 200) { console.log("API返回错误内容:", body); return res.status(response.statusCode).send(body); } // 用try-catch包裹JSON解析,避免非JSON数据导致服务崩溃 try { const data = JSON.parse(body); const currentPrice = data.last; const weeklyAvgPrice = data.averages.week; res.send(`<h1>当前比特币价格是 ${currentPrice} USD</h1>`); console.log("当前价格:", currentPrice); console.log("周平均价格:", weeklyAvgPrice); } catch (parseErr) { console.log("数据解析失败:", parseErr); return res.status(500).send("处理数据时发生错误"); } }); }); // 启动服务器监听 app.listen(3000, () => { console.log("服务器已在localhost:3000启动!"); });
额外小建议
request模块已被官方标记为废弃,后续可以考虑换成axios或者node-fetch这类维护活跃的模块,它们用法更简洁,比如axios会自动帮你解析JSON,不用手动调用JSON.parse。- 以后写后端代码记得多添加错误捕获逻辑,不然单个请求失败就导致整个服务崩溃,用户体验会很差哦~
内容的提问来源于stack exchange,提问作者Mohamad3736
相关产品推荐
相关产品推荐

