使用Express搭建的NodeJS API调用FS模块无法写入本地JSON文件问题
Express写入本地JSON文件失败解决方案
核心原因
- 未正确结束HTTP请求响应:async路由处理函数中没有给客户端返回响应,Express无法感知请求处理完成,异步文件写入的IO操作可能在请求上下文被销毁时中断,所以出现控制台打印了数据但没写入文件的情况
- 相对路径指向不符合预期:
./configs.json是相对于Node进程启动时的工作目录的路径,不是当前代码文件所在的目录,很可能文件已经写入到其他目录,你找错了位置 - 错误被静默吞掉:try catch中抛出的错误没有Express错误处理中间件承接,异步报错不会输出到控制台,你看不到权限不足、目录不存在之类的写入失败提示
修复方案
1. 完善updateData函数逻辑
修改代码如下,添加响应返回、绝对路径和错误输出:
const fs = require('fs').promises; const path = require('path'); async function updateData(req,res){ try { let { name, phone, email, addres, whatsapp, officeHours} = req.body; let configs={ name:name, phone:phone, email:email, addres:addres, whatsapp:whatsapp, officeHours: officeHours }; let data = JSON.stringify(configs, null, 2); // 加格式化方便阅读 console.log(data); // 用__dirname拼接绝对路径,确保写入到当前文件所在目录 const targetPath = path.join(__dirname, './configs.json'); await fs.writeFile(targetPath, data); // 写入完成后返回响应,通知Express请求处理完成 return res.status(200).json({code:0, msg:'写入成功'}) }catch(err){ console.error('写入文件失败:', err); // 打印错误到控制台 return res.status(500).json({code:1, msg:'写入失败', error: err.message}) } } module.exports = {updateData};
2. 确认前置配置
确保你的Express入口文件已经配置了body解析中间件,否则req.body会为undefined(你现在能打印出数据说明已经配置,可跳过):
const express = require('express'); const app = express(); // 解析json格式的请求体 app.use(express.json()); // 解析form表单格式的请求体 app.use(express.urlencoded({extended: true}));
修改完成后重新启动服务发送请求,即可在当前代码文件所在目录看到生成的configs.json文件,如果写入失败控制台会打印具体错误原因。
内容的提问来源于stack exchange,提问作者Erick Scur
相关产品推荐
相关产品推荐

