Error: Can't set headers after they are sent while reading files

Error: Can't set headers after they are sent while reading files

我在尝试读取文件并将响应发送回浏览器时遇到以下错误。

[ 'Error: Can\'t set headers after they are sent.',
  '    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11)',
  '    at ServerResponse.setWriteHeadHeaders (/somepath/node_modules/on-headers/index.js:82:19)',
  '    at ServerResponse.writeHead (/somepath/node_modules/on-headers/index.js:41:36)',
  '    at /somepath/server/custom.js:71:13',
  '    at FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:380:3)' ]

var fs = require('fs');

exports.customPageChatStatus = function(req, res) {
 if(req.params._pagename === 'Test123')
 {
      fs.readFile("/somepath/Test123.txt", 'utf-8', function(err, data) {
        if (err) console.log(err);
        res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
        res.end(data);
      });
 }
 if(req.params._pagename === 'SecondFile')
 {
      fs.readFile("/somepath/SecondFile.txt", 'utf-8', function(err, data) {
        if (err) console.log(err);
        res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
        res.end(data);
      });
 }
 else {
  fs.readFile("/somepath/InActive.txt", 'utf-8', function(err, data) {
        res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
        res.end(data);
      });
 }
};

有趣的是,我仅在读取第一个文件 (Test123.txt) 时看到上述错误,而在读取 "SecondFile.txt".

时没有问题

感谢解决此问题的任何帮助!

此处如果您在语句中使用 else if 将解决您的问题

var fs = require('fs');

    exports.customPageChatStatus = function(req, res) {
        if(req.params._pagename === 'Test123')
        {
                fs.readFile("/somepath/Test123.txt", 'utf-8', function(err, data) {
              if (err) console.log(err);
               res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
            res.end(data);
                });
        }
        else if(req.params._pagename === 'SecondFile')
        {
                fs.readFile("/somepath/SecondFile.txt", 'utf-8', function(err, data) {
               if (err) console.log(err);
               res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
            res.end(data);
                });
        }
        else {
            fs.readFile("/somepath/InActive.txt", 'utf-8', function(err, data) {
               res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
            res.end(data);
                });
        }
    };

令人惊讶的是 if..else if.. 实际上是一个问题。我确信这两个条件永远不会成立。

我想到了一个更简洁的方法。

更简单的代码:

var fs = require('fs');

exports.customPageChatStatus = function(req, res) {
    let pagename = req.params.pagename;

    if (pagename !== 'Test123' || pagename !== 'Secondfile') pagename = 'InActive';

    fs.readFile(`/somepath/${pagename}.txt`, 'utf-8', function(err, data) {
    if (err) return console.log(err);
    res.writeHead(200, {'Content-Type':'text/plain', 'Access-Control-Allow-Origin':'*' });
    return res.end(data);
    });
};