Node.js使用npm request调用Cryptonator API时JSON解析语法错误
解决使用request包调用Cryptonator API时的语法错误问题
我刚看完你的问题,你遇到的语法错误其实根源不是代码写在一行的格式问题(虽然紧凑代码确实容易埋坑),而是你尝试解析的body是HTML内容,不是预期的JSON数据,这才导致JSON.parse抛出SyntaxError,错误信息里的<!DOCTYPE html>就是最直接的证据。
先一步步来解决:
1. 先修复代码的格式与错误处理
你的原始代码太紧凑,不仅难读,还没处理任何异常情况,先把它格式化并增加错误处理逻辑,避免程序崩溃:
// 记得先引入request包,没装的话先运行 npm install request const request = require('request'); router.get('/dashboard', isLoggedIn, function(req, res) { request('https://api.cryptonator.com/api/ticker/btc-usd', function(err, response, body) { // 先处理请求本身的错误,比如网络问题 if (err) { console.error('API请求失败:', err); return res.status(500).render('dash-web/home', { crypto: null, error: '无法获取加密货币数据' }); } // 检查响应状态码,非200直接返回错误 if (response.statusCode !== 200) { console.error('API返回异常状态码:', response.statusCode, body); return res.status(500).render('dash-web/home', { crypto: null, error: '加密货币数据服务异常' }); } // 尝试解析JSON,用try-catch包裹,防止非JSON内容导致崩溃 let cryptoData; try { cryptoData = JSON.parse(body); } catch (parseErr) { console.error('JSON解析失败:', parseErr); console.log('API返回的原始内容:', body); // 打印出来看看到底是什么 return res.status(500).render('dash-web/home', { crypto: null, error: '数据解析失败' }); } // 一切正常,渲染页面 res.render('dash-web/home', { crypto: cryptoData }); }); });
2. 排查为什么API返回HTML
错误里的HTML说明你请求到的不是Cryptonator的JSON接口,而是某个错误页面,可能的原因和解决方法:
- 检查网络环境:有没有代理、防火墙或者VPN拦截了请求?可以直接在浏览器里打开
https://api.cryptonator.com/api/ticker/btc-usd,看看返回的是不是JSON数据。正常情况下应该是类似{"ticker":{"base":"BTC",...}}的内容。 - 添加请求头:有些API会拦截没有User-Agent的请求,把你识别成机器人。可以给request加个自定义User-Agent:
request({ url: 'https://api.cryptonator.com/api/ticker/btc-usd', headers: { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } }, function(err, response, body) { // 后续处理同上 });
- 考虑替换request包:request已经被官方弃用了,不再维护,建议换成axios或者node-fetch这类更活跃的包,比如用axios的写法会更简洁:
const axios = require('axios'); router.get('/dashboard', isLoggedIn, async function(req, res) { try { const response = await axios.get('https://api.cryptonator.com/api/ticker/btc-usd', { headers: { 'User-Agent': '你的自定义UA' } }); res.render('dash-web/home', { crypto: response.data }); } catch (err) { console.error('请求出错:', err); res.status(500).render('dash-web/home', { crypto: null, error: '获取加密货币数据失败' }); } });
按照上面的步骤调整后,应该就能解决你的语法错误问题了。
内容的提问来源于stack exchange,提问作者Fillipo Sniper
相关产品推荐
相关产品推荐

