在socket.io中使用restify时,'headers already sent'错误

我正在跟随正式的游戏指南来使用socketio和restify。

api.js

var mongoose = require('mongoose'); var restify = require('restify'); var fs = require('fs'); var server = restify.createServer({ name: 'myapp', version: '1.0.0' }); var io = require('socket.io')(server); server.get('/', function indexHTML(req, res, next) { fs.readFile(__dirname + '/sockettest.html', function (err, data) { if (err) { next(err); return; } res.setHeader('Content-Type', 'text/html'); res.writeHead(200); res.end(data); next(); }); }); io.on('connection', function(socket){ console.log('a user connected'); }); 

sockettest.html

 <html> <script src="https://cdn.socket.io/socket.io-1.3.7.js"></script> <script> var socket = io(); </script> </html> 

当我浏览到localhost:3000我得到这个错误:

 myapp listening at http://[::]:3000 _http_outgoing.js:350 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_outgoing.js:350:11) at ServerResponse.format (/host/bid-it/bid-it/node_modules/restify/lib/response.js:145:10) at ServerResponse.send (/host/bid-it/bid-it/node_modules/restify/lib/response.js:338:14) at emitRouteError (/host/bid-it/bid-it/node_modules/restify/lib/server.js:201:13) at onRoute (/host/bid-it/bid-it/node_modules/restify/lib/server.js:754:21) at Router.find (/host/bid-it/bid-it/node_modules/restify/lib/router.js:608:5) at Server._route (/host/bid-it/bid-it/node_modules/restify/lib/server.js:747:21) at routeAndRun (/host/bid-it/bid-it/node_modules/restify/lib/server.js:705:14) at Server._handle (/host/bid-it/bid-it/node_modules/restify/lib/server.js:725:9) at Server.onRequest (/host/bid-it/bid-it/node_modules/restify/lib/server.js:326:14) at emitTwo (events.js:87:13) at Server.emit (events.js:172:7) at HTTPParser.parserOnIncoming [as onIncoming] (_http_server.js:525:12) at HTTPParser.parserOnHeadersComplete (_http_common.js:88:23) 

你能告诉我我错过了什么吗?

运用

var io = require('socket.io')(server.server);

代替

var io = require('socket.io')(server);

解决了我的问题。

尝试在创buildrestify服务器的地方将socket.io参数设置为true,如下所示:

 var server = restify.createServer({ name: 'myapp', version: '1.0.0, socketio: true }); 

这解决了我的问题。