Node Express问题:写入文件后res.render()无法正常渲染页面
解决使用async/await写入JSON后Express无法渲染模板的问题
问题背景
我写了一个结合async/await和Promise的Express接口,原本逻辑是先把JSON数据写入文件,再渲染Pug模板返回给前端。但遇到了诡异的情况:JSON文件能正常生成,控制台也没抛出任何错误,但浏览器就是无法连接服务器,页面完全无法渲染。有意思的是用res.send()替代res.render()就能正常工作,换了write-json-file模块也遇到一模一样的问题。我的代码如下:
const fse = require('fs-extra'); exports.testJSON = async (req, res) => { await fse.writeJson('./data/foo.json', {Key: '123'}) .then(function(){ console.log('JSON updated.') }) .catch(function(err){ console.error(err); }); res.render('frontpage', { title: 'JSON Updated...', }); }
排查过程与最终结论
一开始我怀疑自己对Promise、磁盘写入或者Express的res.render()方法存在根本性理解误区,反复检查异步逻辑、模板路径和配置都没找到问题。直到后来才发现,问题根本和Express、JSON写入无关——是nodemon的自动重启机制在捣乱!
每次JSON文件写入保存后,nodemon检测到文件变更就会自动重启服务器,这直接打断了正在处理的请求流程,导致res.render()还没来得及把响应返回给前端,服务器就重启了,自然浏览器收不到任何响应,看起来像是连接失败。
解决办法
要解决这个问题,只需要配置nodemon忽略指定的数据文件或目录,让它不会因为JSON文件的变更而重启服务器。比如在项目根目录创建nodemon.json配置文件,添加如下内容:
{ "ignore": ["data/*.json"] }
这样nodemon就会忽略data目录下所有JSON文件的变更,服务器不会在写入数据时触发重启,请求流程就能正常走完,res.render()也能顺利返回渲染后的页面了。
内容的提问来源于stack exchange,提问作者Malibur
相关产品推荐
相关产品推荐

