2017-11-02 1 views
0

Ich versuche eine App mit Node.js, Express und Socket.io auf IBM Bluemix zu erstellen Ich verwende EJS als Motor ansehen. Dies ist der relevante Teil meines Codes -Die Verwendung von Socket.io mit EJS verursacht den Fehler "Header können nach dem Senden nicht gesetzt werden"

const express = require('express'); 
const app = express(); 
//copied from socket.io tutorial 
const http = require('http').Server(app); 
const io = require('socket.io')(http); 
app.set('view engine', 'ejs'); 
app.set('views', path.join(__dirname, '../templates')); 
... 
app.get('/', function (req, res) { 
    logger.info('index'); 
    return res.render('index'); 
}); 
... 
const port = process.env.PORT || localConfig.port; 
http.listen(port); 

Nun, wenn ich auf localhost navigieren: 3000, ich den Fehler

Error: Can't set headers after they are sent. 
at validateHeader (_http_outgoing.js:489:11) 
at ServerResponse.setHeader (_http_outgoing.js:496:3) 
at ServerResponse.header (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/response.js:767:10) 
at ServerResponse.contentType (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/response.js:595:15) 
at ServerResponse.send (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/response.js:145:14) 
at done (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/response.js:1004:10) 
at tryHandleCache (/home/aniket/Documents/HumbleHelper/node_modules/ejs/lib/ejs.js:228:10) 
at View.exports.renderFile [as engine] (/home/aniket/Documents/HumbleHelper/node_modules/ejs/lib/ejs.js:437:10) 
at View.render (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/view.js:135:8) 
at tryRender (/home/aniket/Documents/HumbleHelper/node_modules/express/lib/application.js:640:10) 

Aus dem Protokoll erhalten, kann ich sehen, dass ‚Index‘ genannt wurde zweimal, gefolgt von dem Fehler. Allerdings, wenn ich diese Zeile entfernen -

Es funktioniert gut. Ich habe andere Fragen gelesen, die erwähnen, dass das wiederholte Aufrufen von *** -Funktionen mehr als einmal dieses Problem verursachen könnte. Meine Vermutung ist, dass das Konstruieren von socket.io über den Server etwas verursacht.

Versions:

socket.io: 2.0.4

express: 4.6.2

ejs 2.5.7

node: 6.9.0

EDIT

Nach dem Kommentieren/uncommenting alle Module, habe ich die Ursache hier, an der Spitze meiner app

require('appmetrics-dash').attach(); 
require('appmetrics-prometheus').attach(); 
+0

'return res.render ('Index');' return nicht –

+0

@RIYAJKHAN Entfernen der Rückkehr bewirkt, dass der gleiche Fehler –

Antwort

0

wahrscheinlich die meisten, sind Sie die socket.io Hörer Konstruktion einer res zu behandeln. Wenn Socket.io eine weitere Übertragung empfängt, verwendet es die vorherige Res, die bereits gesendet wurde.

Um dies zu beheben, entfernen Sie den Listener, nachdem Sie damit fertig sind, damit Sie einen neuen Listener mit der neuen res erstellen können. Zum Beispiel:

socket.on('example', function(data){ 
    socket.removeAllListeners('example'); 
    res.send(data); 
}); 

EDIT: Whoops! Irgendwie lese ich die Frage falsch lol. Versuchen Sie folgendes:

var express = require('express'); 
var app = express(); 
var http = require('http').createServer(app); 
var io = require('socket.io').listen(http); 
+0

versucht, das benötigt wird. Hat nicht funktioniert.Meine Vermutung ist, dass es den Fehler verursacht, dass socket.io und express auf denselben Port hören –

Verwandte Themen