【问题标题】:Can't set headers after they are sent发送后无法设置标头
【发布时间】:2013-04-06 11:00:58
【问题描述】:

我使用的是节点版本 0.10.3 和 Express 3.1.1。

我正在尝试返回一个简单的响应,但我收到以下错误:

http.js:692
    throw new Error('Can\'t set headers after they are sent.');
          ^
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (http.js:692:11)

我已经阅读了很多关于它的内容,并尝试了很多解决方案,但我仍然收到该错误。 我使用了节点检查器,但在那一行之后出现了错误 -

res.render('index', { title: 'Express' });

app.js:

/**
 * Module dependencies.
 */

var express = require('express')
  , http = require('http')
  , path = require('path')
  , socketio = require('socket.io');

var app = express()
  , server = http.createServer(app)
  , io = socketio.listen(server);

app.configure(function(){
  app.set('port', process.env.PORT || 3000);
  app.set('views', __dirname + '/views');
  app.set('view engine', 'hjs');
  app.use(express.favicon());
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(path.join(__dirname, 'public')));
});

app.configure('development', function(){
  app.use(express.errorHandler());
});

server.listen(app.get('port'), function(){
  console.log("Express server listening on port " + app.get('port'));
});


io.configure('production', function(){
  io.enable('browser client etag');
  io.set('log level', 1);
});

io.configure('development', function(){
  io.set('log level', 1);
});

io.sockets.on('connection', function(socket) {
    socket.on('event', function(event) {
        socket.join(event);
    });
});

require('./routes')(app, io);

routes/index.js:

var utils = require('../utils')
  , config = require('../config')
  , io;

module.exports = function(app, socketio) {
  io = socketio;
  app.get('/', index);
};

var index = function(req, res){
  res.render('index', { title: 'Express' });
};

views/index.hjs:

<!DOCTYPE html>
<html>
  <head>
    <title>{{ title }}</title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1>{{ title }}</h1>
    <p>Welcome to {{ title }}</p>
  </body>
</html>

package.json:

{
  "name": "blabla",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "app.js"
  },
  "dependencies": {
    "express": "3.0.3",
    "hjs": "0.0.4",
    "cradle": "0.6.4",
    "twiliosig": "0.0.1",
    "socket.io": "0.9.11"
  },
  "subdomain": "blabla",
  "engines": {
    "node": "0.6.x"
  }
}

有什么线索吗?

【问题讨论】:

  • 您发布的代码似乎没有问题(我也在本地测试过,效果很好)。
  • node.js和express同版本下?
  • 是的,相同的版本。我在您的代码中没有看到任何可能导致您出现问题的明显内容。
  • 看起来有些模块在调用索引函数之前发送了标头。您是否尝试注释掉所有不必要的模块(大多数 app.use 调用、io 部分等)以找到导致问题的模块?
  • 我试图只保留:app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('视图引擎', 'hjs');在我的 app.use 中。仍然,当我导航到 localhost:3000 时,仍然存在同样的问题。奇怪的是,现在它确实加载了 CSS 文件(但仍然抛出该错误)

标签: node.js express


【解决方案1】:

您的 socket.io 版本似乎有错误。

使用这个:

"dependencies": {
  "express": "3.0.x",
  "hjs": "0.0.4",
  "cradle": "0.6.4",
  "twiliosig": "0.0.1",
  "socket.io": "0.9.x"
}

使用 socket.io@0.9.16 测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-20
    • 2011-10-17
    • 2014-12-06
    • 2015-12-25
    • 2018-03-13
    • 2018-03-04
    相关资源
    最近更新 更多