Экспресс узла: проблема с res.render() после записи файла на диск
Я пишу метод, который использует 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...',
});
}
Я начинаю думать, что есть нечто фундаментальное, чего я не понимаю, что противоречит обещаниям, записи на диск и / или экспресс-методу res.render. Стоит отметить, что res.send() работает нормально.
Я также попробовал другой модуль NPM для записи файла (write-json-file). Это дало мне точно такую же проблему.
ОБНОВЛЕНИЕ: Так что я идиот. Проблема не имеет ничего общего с Express og JSON-файлом. Это связано с тем, что я запускаю nodemon для автоматического перезапуска сервера при изменении файлов. Поэтому, как только JSON-файл будет сохранен, сервер перезапустится, остановив процесс рендеринга страницы. Извиняюсь перед удивительными людьми, которые все равно пытаются мне помочь. Вы все еще помогли мне решить проблему, поэтому я очень ценю это!
1 ответ
Вот актуальная проблема:
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");
}
}