Node+Express开发REST API时Postman调用报Unexpected token in JSON错误
问题解决方案
问题原因
- 核心报错是
express.json()中间件尝试解析请求体时,收到的内容不是合法JSON格式,所以抛出解析错误 - 浏览器访问走的是GET请求,无请求体,不会触发JSON解析逻辑,所以正常返回;Postman发送的是带请求体的POST请求,配置不当就会触发该错误
解决步骤
1. 修正Postman请求配置
- 选中POST请求的Body标签,勾选
raw选项,右侧下拉格式选择JSON,不要使用form-data、x-www-form-urlencoded格式 - 输入符合JSON语法的请求体,示例:
{ "id": 22, "name": "测试学生", "class": "10" }
- 检查Headers标签,确认存在
Content-Type: application/json的配置,如无则手动添加
2. 补充代码容错逻辑,避免崩溃
调整server.js,添加JSON解析错误处理中间件
在所有路由之后、app.listen之前添加如下代码:
// 捕获JSON解析错误 app.use((err, req, res, next) => { if (err instanceof SyntaxError && err.status === 400 && 'body' in err) { return res.status(400).send({ error: '请求体JSON格式不合法' }); } next(); });
同时给所有路由的Promise添加catch错误捕获,以POST路由为例:
app.post('/api/student',(req, res)=>{ const student = req.body; data.getStudent() .then(students=>{ students.push(student) return data.insertStudent(students) }) .then(() =>{ res.send(students) }) .catch(err => { res.status(500).send({error: '操作失败', msg: err.message}) }) })
调整data.js,补充读写和JSON解析错误处理
const fs = require('fs'); const getStudent = ()=>{ return new Promise((resolve, reject)=>{ fs.readFile('./db.json', 'utf-8',(err, data)=>{ if (err) return reject(err); try { const student = JSON.parse(data); resolve(student); } catch (parseErr) { reject(new Error('db.json格式损坏,解析失败')); } }) }) } const insertStudent = (students) =>{ return new Promise((resolve,reject)=>{ // 第三个参数2用于格式化JSON输出,提升db.json可读性 fs.writeFile('./db.json',JSON.stringify(students, null, 2),(err)=>{ if (err) return reject(err); resolve("ok"); }) }) } module.exports.getStudent = getStudent; module.exports.insertStudent = insertStudent;
内容的提问来源于stack exchange,提问作者noob_developer
相关产品推荐
相关产品推荐

