【问题标题】:node express: Issue with res.render() after writing file to disknode express:将文件写入磁盘后 res.render() 出现问题
【发布时间】:2018-01-18 01:10:45
【问题描述】:

我正在编写一个使用 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)。它给了我完全相同的问题。

更新: 所以我是个白痴。该问题与 Express og JSON 文件无关。这与我正在运行 nodemon 以在文件更改时自动重新启动服务器这一事实有关。因此,一旦保存了 JSON 文件,服务器就会重新启动,从而停止呈现页面的过程。向那些试图帮助我的很棒的人道歉。你仍然帮助我解决了这个问题,所以我真的很感激!

【问题讨论】:

  • 如果您注释掉 JSON 文件的写入,res.render() 本身是否工作正常?
  • fse.writeJson() 是否有可能更改当前目录导致您的res.render() 无法找到文件名?我建议您向res.render() 添加回调,看看它是否返回错误代码。
  • 如果我注释掉那一行,res.render 工作正常。
  • 不确定向 res.render 添加回调是什么意思。你能解释一下我是怎么做到的吗?您可能对目录的事情是正确的。不知道如何测试它或解决它
  • @jfriend00 啊,明白你的意思了。不幸的是,在向 res.render() 添加回调时它不会给我一个错误。

标签: json node.js express fs-extra


【解决方案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");
     }
}

【讨论】:

  • 非常感谢您抽出宝贵的时间来写这篇文章。同样的事情也会发生,在控制台中会出现这样的结果:
  • 两个 cwd 命令返回相同的工作目录,以 '/app' 结尾
  • 然后“即将调用 res.render()”是 printet 作为最后一件事。
  • "JSON updated" 也是两个 cwd 日志之间的 printet
  • @MaltheMilthers - 我添加了几个 console.log() 声明。请重新运行并捕获整个控制台日志。你是说"after calling res.render()" 没有显示在日志中吗?我需要查看整个控制台输出。你能把它放在一些在线资源中,比如 jsFiddle 或网络上的其他免费地方,然后在这里放一个链接,这样我就可以在控制台中看到确切的文本了吗?
猜你喜欢
  • 1970-01-01
  • 2015-05-04
  • 2019-07-03
  • 2012-11-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多