node express:将文件写入磁盘后 res.render() 出现问题
node express: Issue with res.render() after writing file to disk
我正在编写一个使用 async/await 的方法,并承诺将一些 JSON 写入文件,然后呈现哈巴狗模板。但是由于某些原因,写JSON的代码与res.render()方法冲突导致浏览器无法连接到服务器。
奇怪的是,我在控制台中没有收到任何错误,JSON 文件按预期生成 — 页面只是无法呈现。
我正在使用 fs-extra 模块写入磁盘。
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...',
});
}
我开始认为我没有得到与承诺冲突的基本内容,写入磁盘 and/or express' res.render 方法。值得注意的是 res.send() 工作正常。
我还尝试了一个不同的 NPM 模块来写入文件 (write-json-file)。它给了我完全相同的问题。
更新:
所以我是个白痴。该问题与 JSON 文件中的 Express 无关。这与我 运行 nodemon 在文件更改时自动重启服务器这一事实有关。因此,一旦 JSON 文件被保存,服务器就会重新启动,停止呈现页面的过程。向那些试图帮助我的人道歉。您仍然帮助我解决了问题,非常感谢!
这是实际问题:
OP 是 运行 nodemon,只要它看到文件更改就会重新启动服务器,这就是停止来自 运行 的代码的原因,因为一旦生成 json 文件服务器重新启动。
解决问题的努力:
解决这个问题需要一些麻烦,因为我需要给你看代码,我会把它放在一个答案中,即使我还不知道是什么导致了这个问题。我建议您使用以下代码全面检测:
const fse = require('fs-extra');
exports.testJSON = async (req, res) => {
try {
console.log(`1:cwd - ${process.cwd()}`);
await fse.writeJson('./data/foo.json', {Key: '123'})
.then(function(){
console.log('JSON updated.')
}).catch(function(err){
console.error(err);
});
console.log(`2:cwd - ${process.cwd()}`);
console.log("about to call res.render()");
res.render('frontpage', {title: 'JSON Updated...',}, (err, html) => {
if (err) {
console.log(`res.render() error: ${err}`);
res.status(500).send("render error");
} else {
console.log("res.render() success 1");
console.log(`render length: ${html.length}`);
console.log(`render string (first part): ${html.slice(0, 20}`);
res.send(html);
console.log("res.render() success 2");
}
});
console.log("after calling res.render()");
} catch(e) {
console.log(`exception caught: ${e}`);
res.status(500).send("unknown exception");
}
}
我正在编写一个使用 async/await 的方法,并承诺将一些 JSON 写入文件,然后呈现哈巴狗模板。但是由于某些原因,写JSON的代码与res.render()方法冲突导致浏览器无法连接到服务器。
奇怪的是,我在控制台中没有收到任何错误,JSON 文件按预期生成 — 页面只是无法呈现。
我正在使用 fs-extra 模块写入磁盘。
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...',
});
}
我开始认为我没有得到与承诺冲突的基本内容,写入磁盘 and/or express' res.render 方法。值得注意的是 res.send() 工作正常。
我还尝试了一个不同的 NPM 模块来写入文件 (write-json-file)。它给了我完全相同的问题。
更新: 所以我是个白痴。该问题与 JSON 文件中的 Express 无关。这与我 运行 nodemon 在文件更改时自动重启服务器这一事实有关。因此,一旦 JSON 文件被保存,服务器就会重新启动,停止呈现页面的过程。向那些试图帮助我的人道歉。您仍然帮助我解决了问题,非常感谢!
这是实际问题:
OP 是 运行 nodemon,只要它看到文件更改就会重新启动服务器,这就是停止来自 运行 的代码的原因,因为一旦生成 json 文件服务器重新启动。
解决问题的努力:
解决这个问题需要一些麻烦,因为我需要给你看代码,我会把它放在一个答案中,即使我还不知道是什么导致了这个问题。我建议您使用以下代码全面检测:
const fse = require('fs-extra');
exports.testJSON = async (req, res) => {
try {
console.log(`1:cwd - ${process.cwd()}`);
await fse.writeJson('./data/foo.json', {Key: '123'})
.then(function(){
console.log('JSON updated.')
}).catch(function(err){
console.error(err);
});
console.log(`2:cwd - ${process.cwd()}`);
console.log("about to call res.render()");
res.render('frontpage', {title: 'JSON Updated...',}, (err, html) => {
if (err) {
console.log(`res.render() error: ${err}`);
res.status(500).send("render error");
} else {
console.log("res.render() success 1");
console.log(`render length: ${html.length}`);
console.log(`render string (first part): ${html.slice(0, 20}`);
res.send(html);
console.log("res.render() success 2");
}
});
console.log("after calling res.render()");
} catch(e) {
console.log(`exception caught: ${e}`);
res.status(500).send("unknown exception");
}
}