Error: Can't set headers after they are sent. Connect.js

Error: Can't set headers after they are sent. Connect.js

我是 Connect.js 的新手,我想弄清楚它到底是如何工作的。我写了一个非常简单的函数——读取文件并打印它。我不确定为什么会收到此错误 错误:发送后无法设置 headers。 非常感谢任何帮助!

我研究过这个问题Nodejs: Connect and “writeHead” in first connect-callback。很有帮助,但是还是没有解决我从文件中读取的数据如何传递的问题。

代码如下:

var connect = require('connect'),
    path = require('path'),
    url = require('url'),
    fs = require('fs');

const hostname = '127.0.0.1';
const port = 3030;

var interceptorFunction = function (req, res, next) {
    fs.readFile(__dirname + "/docs/test.html", 'utf-8', function (error, data) {
        if (error) {
            res.writeHead(500);
            return res.end('Error');
        }
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.write(data);
            return res.end('Success');

    });

    next();
}

var server = connect()
        .use(interceptorFunction);

server.listen(port, hostname, function () {
    console.log('Server running at http://' + hostname + ':' + port + '/');
});

感谢下面的回答和 Nodejs: Connect and “writeHead” in first connect-callback,我设法生成了一个工作代码。我遇到的关于 Connect.js 的问题之一是关于 next() 的用法。由于应用程序非常简单,我使用的是next,后面没有回调,所以程序崩溃了。

这是工作代码。我希望它可能对其他人有用:

var connect = require('connect');
var fs = require('fs');

var simpleApp = connect();

simpleApp
    .use(function (req, res, next) {

        fs.readFile(__dirname + "/docs/test.html", 'utf-8', function (error, data) {
            if (error) {
                res.statusCode = 500;
                return res.end();
            }

            res.statusCode = 200;
            res.setHeader('Content-Type', 'text/html');
            return res.end(data);

        });

        console.log('Pre');
        next();
        console.log('Post');
    })
    .use(function (req, res) {
        console.log('Some other functionality here');
    });

simpleApp.listen(3030);

而不是:

res.writeHead(500);
return res.end('Error');

你可以试试这个快递 4.x:

res.status(500);
res.send('Error');
return res.end();

或者这个用于 Express 3.x:

res.send(500, 'Error');
return res.end();

或此用于不使用 Express 的连接:

res.statusCode = 500;
return res.end('Error');

而不是:

res.writeHead(200, {'Content-Type': 'text/html'});
res.write(data);
return res.end('Success');

你可以试试 Express 4.x:

res.status(200);
res.type('html');
res.send(data);
return res.end();

或者这个用于 Express 3.x:

res.set('Content-Type', 'text/html');
res.send(200, data);
return res.end();

或此用于不使用 Express 的连接:

res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
return res.end(data);

等它可以使用一些快捷方式来编写,但在这里我明确地写了所有内容以显示正在发生的事情。

请注意,如果您已经在编写 data,则无需在末尾添加 'Success' 字符串。

我的建议是,如果您是 Connect 的新手并且在编写代码时遇到问题,那么也许您可以尝试 Express。它使用起来更方便并且有更好的文档 - 请参阅:

有关服务静态文件 n 节点的更多信息,请参阅