【问题标题】:Error: Can't set headers after they are sent. Connect.js错误:发送后无法设置标题。连接.js
【发布时间】:2017-01-28 09:34:32
【问题描述】:

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

我研究过这个问题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,后面没有回调,所以程序crash了。

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

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

【问题讨论】:

  • writeHead 立即写入标头。您不能将writeHead 与写入响应的其他方法结合使用。请参阅我已将其标记为重复的问题。
  • 这意味着我必须将数据参数传递给最后一个回调并将其设置在那里?对吗?

标签: node.js connect.js


【解决方案1】:

代替:

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

你可以在 Express 4.x 上试试这个:

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

或者对于 Express 3.x:

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

或者对于 Connect without 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();

或者对于 Connect without Express:

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

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

请注意,当您已经在编写 data 时,无需在末尾添加“成功”字符串。

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

有关在节点上提供静态文件的更多信息,请参阅this answer

【讨论】:

  • 由于某种原因我得到 TypeError: res.status is not a function
  • @NeliChakarova 您使用的是什么版本的 Express?
  • @NeliChakarova 查看我更新的答案以获取 Express 3.x 的示例
  • 我只使用 Connect.js
  • @NeliChakarova 好的。我添加了 Connect without Express 的示例。它对你有用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2015-03-07
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多