Экспресс узла: проблема с 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");
     }
}
Другие вопросы по тегам