Express.js记事本项目保存新笔记时出现JSON解析错误求助
问题解决:Express记事本保存笔记时JSON解析错误
错误原因
你的POST /api/notes路由存在两个核心问题:
fs.readFile是异步方法,返回的是Promise对象而非文件内容字符串。直接对Promise执行JSON.parse,会把"[object Promise]"当作JSON解析,这就是Unexpected token o错误的根源。- 未等待
fs.writeFile完成就返回响应,可能出现文件未写完就给客户端返回结果的情况,无法保证数据一致性。
修正后的代码
const express = require('express'); const jsonRoutes = express.Router(); const fs = require('fs').promises; const uuid = require('uuid'); jsonRoutes.get('/api/notes', async (req, res) => { try { const data = await fs.readFile('db/db.json', 'utf8'); const notes = JSON.parse(data); res.json(notes); } catch (err) { res.status(500).json({ error: '读取笔记失败' }); } }); jsonRoutes.post('/api/notes', async (req, res) => { try { // 等待文件读取完成,拿到实际字符串内容 const dataStr = await fs.readFile('db/db.json', 'utf8'); const data = JSON.parse(dataStr); const newNote = { title: req.body.title, text: req.body.text, id: uuid.v4(), }; data.push(newNote); // 等待文件写入完成再返回响应 await fs.writeFile('db/db.json', JSON.stringify(data, null, 2)); res.json(newNote); } catch (err) { res.status(500).json({ error: '保存笔记失败' }); } }); module.exports = jsonRoutes;
额外优化说明
- 加入
try/catch捕获异步操作错误,避免服务器崩溃,同时给客户端返回明确的错误提示。 JSON.stringify添加null, 2参数,让生成的JSON文件格式化后更易读。- 移除对象属性的多余引号,保持代码简洁规范。
内容的提问来源于stack exchange,提问作者Sam williams
相关产品推荐
相关产品推荐

