You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:54:12