【问题标题】:Node.js throws an error that says: Can't set headers after they are sentNode.js 抛出一个错误,上面写着:Can't set headers after they are sent
【发布时间】:2013-04-27 16:46:39
【问题描述】:

我正在学习 node.js。下面的代码取自一本应该可以工作的书。如果我访问 localhost:8080/stooges/chat,它会抛出 http.js:704 throw new Error('Can\'t set headers after they are sent.')

var express = require('express');
var http = require('http');
var app = express();
var server = http.createServer(app);
var io = require('socket.io').listen(server);
var catchPhrases = ['Why I oughta...', 'Nyuk Nyuk Nyuk!', 'Poifect!', 'Spread out!',   
'Say a few syllables!', 'Soitenly!'];

app.set('view engine', 'jade');
app.set('view options', { layout: true });
app.set('views', __dirname + '/views');

app.get('/stooges/chat', function(req, res, next) {
res.render('chat');
});

io.sockets.on('connection', function(socket) {
var sendChat = function( title, text ) {
    socket.emit('chat', {
        title: title,
        contents: text
    });
};

setInterval(function() {
    var randomIndex = Math.floor(Math.random()*catchPhrases.length)
    sendChat('Stooge', catchPhrases[randomIndex]);
}, 5000);

sendChat('Welcome to Stooge Chat', 'The Stooges are on the line');
socket.on('chat', function(data){
    sendChat('You', data.text);
});
});

app.get('/?', function(req, res){
res.render('index');
});

var port = 8080;
server.listen(port);
console.log('Listening on port ' + port);

上面代码中的哪一行触发了错误?为什么?

更新: 我注释掉了var io = require('socket.io').listen(server); 这行,这似乎是导致错误的原因。

更新: 根据 robertklep 的要求,这里是聊天模板:

extends layout

block scripts
script(type='text/javascript', src='/socket.io/socket.io.js')
script(type='text/javascript')
    var socket = io.connect('http://192.168.1.34:8080');
    socket.on('chat', function(data) {
        document.getElementById('chat').innerHTML =
        '<p><b>' + data.title + '</b>: ' + data.contents + '</p>';
    });
    var submitChat = function(form) {
        socket.emit('chat', {text: form.chat.value});
        return false;
    };

block content
div#chat

form(onsubmit='return submitChat(this);')
    input#chat(name='chat', type='text')
    input(type='submit', value='Send Chat')

【问题讨论】:

  • 代码看起来不错,但我无法重现该问题。确保您的 Node 和模块版本(合理地)是最新的(我使用的是 Node 0.10.4、Express 3.2.0 和 socket.io 0.9.14)。
  • @robertklep:我使用的是 Node 0.10.5、Express 3.2.0 和 socket.io 0.9.11。为什么我的安装中的 socket.io 比较旧?我正在使用 Ubuntu 12.04 仅供参考。
  • 0.9.11 可能是客户端版本。顺便说一句,你能把你的模板也展示一下吗?
  • @robertklep:已更新。谢谢!
  • 我不知道为什么它不适合你,它适合我。看起来它与这篇文章有关:stackoverflow.com/questions/11801882/… 但除了升级到最新版本(您已经在使用)或回到旧版本的 Node 之外,似乎没有明确的解决方案。

标签: node.js express socket.io


【解决方案1】:

原来我使用了错误版本的 socket.io。我将 pakcage.json 中的依赖项从 0.9.10 更新到 0.9.14 并且它起作用了。感谢您的帮助!

【讨论】:

  • History.md 显示最新版本为 0.9.12,但从 0.9.10 更新到该版本解决了问题。
猜你喜欢
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多