React应用调用Express的/index.js路由获取JSON失败,报SyntaxError
解决React调用Express接口时的JSON解析错误
看起来你遇到的问题核心是Express路由没有正确返回JSON数据,加上React的请求路径不匹配,导致解析失败。我来一步步帮你排查修复:
1. 修复Express路由代码的核心问题
你提供的index.js路由代码有个致命错误:回调函数里只是定义了一个对象,但没有通过res.json()或res.send()把数据发送给客户端!这会让Express默认返回404错误页面(HTML格式),所以React在解析JSON时会遇到HTML的<字符,抛出Unexpected token <的错误;如果是其他非JSON响应,就会出现类似Unexpected token P的错误。
修正后的index.js代码:
var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { // 用res.json()发送标准的JSON响应 res.json({ vitamins: [ { name: "Vitamin B2" } ], minerals: [ { name: "Zinc" } ] }); }); // 别忘了导出路由 module.exports = router;
2. 确保Express主文件正确挂载路由
在你的Express主应用文件(比如app.js)里,要确保把这个index路由挂载到正确的路径:
const indexRouter = require('./routes/index'); // 挂载到根路径 /,这样访问 / 就会触发上面的路由 app.use('/', indexRouter);
3. 修正React的请求路径
你之前用fetch('/index'),但如果路由是挂载在根路径/,这个请求会找不到对应的路由,返回404 HTML。应该改成请求根路径:
componentDidMount() { fetch('/') .then(res => { // 先检查响应状态是否正常,避免隐藏错误 if (!res.ok) { throw new Error(`HTTP error! Status: ${res.status}`); } return res.json(); }) .then(micros => { this.setState({ micros: micros.vitamins }); }) .catch(err => { // 添加错误捕获,方便调试 console.error('请求出错:', err); }); }
额外调试技巧
- 直接在浏览器地址栏访问
http://localhost:你的端口/,看看返回的是不是合法的JSON字符串,如果是HTML,说明路由还是有问题 - 打开浏览器开发者工具的Network标签,查看请求的响应内容,确认返回的是不是你预期的JSON
内容的提问来源于stack exchange,提问作者John White
相关产品推荐
相关产品推荐

