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

时间:2018-01-25 12:11:55

标签: javascript node.js

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

我用棱角分析恢复数据。

  

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

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);
            });
        });
    })
});

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

您无法向请求发送多个回复。你必须同步读取所有文件并使用你得到的所有文件制作一个res.send。

答案 1 :(得分:0)

你不能在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);
        })
    });

答案 2 :(得分:0)

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

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);
});

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