所以我运行了这个基本的node.js服务器,现在我想用socket io添加另一个层。我可以使用socket io,示例here非常简单,效果很好。但我的应用程序要大得多,所以我做这个事情,我加载了一堆资源,然后通过调用start_app加载这个服务器模块。
我知道我不能把io.listen(app)放在第3行,因为我的服务器还没有启动。
我需要功能依赖,所以我如何添加socket.io添加到混合?
var app= require('http') // all http requests go to onRequest
, url= require('url') // path info stuff
, io = require('socket.io') // socket io
function start_app(route, handle) {
function onRequest(request, response) {
var pathname = url.parse(request.url).pathname.replace("/","")
route(handle, pathname, request, response)
}
app.createServer(onRequest).listen(process.env.PORT || 8888)
io.listen(app)
console.log(". http://localhost:8888 .")
}
exports.start_app = start_app;
我的错误:
...socket.io/lib/manager.js:104
server.on('error', function(err) {
^
TypeError: Object #<Object> has no method 'on'...
答案 0 :(得分:1)
而不是你的代码:
app.createServer(onRequest).listen(process.env.PORT || 8888)
io.listen(app)
你能这样做吗?
var createdServer = app.createServer(onRequest).listen(process.env.PORT || 8888);
io.listen(server).on('connection', function (socket) {
socket.on('message', function (msg) {
console.log('Message Received: ', msg);
socket.broadcast.emit('message', msg);
});
});
我们需要实际创建的服务器,所以socket.io可以听取它。然后处理'connection'
事件。
答案 1 :(得分:0)
更改服务器的前几行修复它。 我不能100%确定为什么会这样,但是我认为服务器在调用此函数之前不应该启动是有意义的,因为它进入了应用程序的主事件循环。
var app // all http requests go to onRequest
, url = require('url') // path info stuff
, sio = require('socket.io') // socket io
function start_app(route, handle) {
app = require('http').createServer(onRequest)
sio = require('socket.io').listen(app)
app.listen(process.env.PORT || 8888)