在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 });
这解决了我的问题。