【问题标题】:Error: Can't set headers after they are sent. NodeJS错误:发送后无法设置标头。节点JS
【发布时间】:2018-01-25 12:11:55
【问题描述】:

我有一个小问题,谁阻止了我。我用 nodeJS 创建了一个小 API,我想发送一个文件内容。

我用 angular 恢复数据。

错误:发送后无法设置标头。

router.get('/posts', (req, res) => {
    fs.readdir('./maps', function(error, files) {
        if(error)
            throw error;

        files.forEach(file => {
            fs.readFile(file, (err, data) => {
                res.send(data);
            });
        });
    })
});

感谢您的帮助。

【问题讨论】:

  • 你不能有 res.send(data);在一个 for 循环中。它只需要执行一次。

标签: javascript node.js


【解决方案1】:

您不能对请求发送多个响应。您必须同步读取所有文件并使用您获得的所有文件进行 ONE res.send。

【讨论】:

  • 我理解我的错误。我已经重构了我的代码,现在我只返回了 1 个数据。
【解决方案2】:

问题在于,在上面的代码中,您每次读取文件时都尝试发送响应

files.forEach(file => {
            fs.readFile(file, (err, data) => {
                res.send(data);//repeated sending of response 
            });
        });

如果您打算在读取所有文件后发送响应,您需要并行读取,一旦所有读取完成,您就可以发送响应。为此,您可以使用 async 或 Promise 库来帮助您轻松完成此操作

async.each(files, function(file, callback) {
    fs.readFile(file, (err, data) => {
                callback(); 
            });

}, function(err) {
    res.send(data);
});

因此,只有在读取所有文件后才会发送响应。

【讨论】:

    【解决方案3】:

    你不能在 for 循环中调用 res.send()。它只需执行一次,因为它将响应发送回 api 的调用者。您可以做的是在 for 循环中连接响应并在最后发送。

    router.get('/posts', (req, res) => {
            fs.readdir('./maps', function(error, files) {
                if(error)
                    throw error;
                var responseData = '';
                files.forEach(file => {
                    fs.readFile(file, (err, data) => {
                        responseData += data; 
                    });
                });
                res.send(responseData);
            })
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多