0

async/await を使用し、JSON をファイルに書き込んで pug テンプレートをレンダリングすることを約束するメソッドを作成しています。しかし、何らかの理由で、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)。それは私にまったく同じ問題を与えました。

更新:だから私はばかです。この問題は、JSON ファイルの Express とは関係ありません。ファイルが変更されたときにサーバーを自動的に再起動するために nodemon を実行しているという事実に関係しています。そのため、JSON ファイルが保存されるとすぐにサーバーが再起動し、ページのレンダリング プロセスが停止します。とにかく私を助けようとしている素晴らしい人々に謝罪します。あなたはまだ私が問題を解決するのを助けてくれたので、本当に感謝しています!

4

1 に答える 1

2

実際の問題は次のとおりです。

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");
     }
}
于 2018-01-17T16:45:53.010 に答える