Express-Generator - 包括 socket.io (bin/www)
Posted
技术标签:
【中文标题】Express-Generator - 包括 socket.io (bin/www)【英文标题】:Express-Generator - Including socket.io (bin/www) 【发布时间】:2015-02-25 01:47:59 【问题描述】:我一直有点像 Perl/php 类型的人,但我想改变一下,Node JS 似乎是我下一步要去的地方。
我已经在 YouTube 上观看了好几个小时的教程,并在这里阅读了一些帖子 - 但我有点卡住了。
我想在我的 express 生成的应用程序 (v4.10.6) 中包含 socket.io。 但与此同时,我真的不想将 socket.on(...) 语句包含在一个文件中——我更愿意像使用路由一样将其拆分。
鉴于 express 生成的应用程序是在 bin/www 中启动的,我很困惑我需要在哪里 require('socket.io') 并指向所有 'on' 事件到。
This post on ***,我想可能会回答我的问题 - 但它表明所有套接字处理程序都在 ./sockets/base.js 文件中 - 我对 Gofilord 对回答。
请原谅我在这里的无知 - 目前这一切对我来说有点陌生,感谢您一如既往地花时间阅读本文并提供您的帮助。
/bin/www
#!/usr/bin/env node
var debug = require('debug')('rhubarb');
var app = require('../app');
app.set('port', process.env.PORT || 1127);
var server = app.listen(app.get('port'), function()
debug('Express server listening on port ' + server.address().port);
);
【问题讨论】:
【参考方案1】:在 app.js 中需要 socket.io 然后告诉你的 io 服务器监听你的应用程序是典型的。使用您发布的示例,它看起来像这样:
var debug = require('debug')('rhubarb');
var app = require('../app');
var server = require('http').Server(app);
var io = require('socket.io')(server);
app.set('port', process.env.PORT || 1127);
var server = server.listen(app.get('port'), function()
debug('Express server listening on port ' + server.address().port);
);
socketio docs 很好地解释了这一点。这是他们主页上的一个例子:
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
app.get('/', function (req, res)
res.sendfile(__dirname + '/index.html');
);
io.on('connection', function (socket)
socket.emit('news', hello: 'world' );
socket.on('my other event', function (data)
console.log(data);
);
);
更新:
我通常通过在/lib
中创建一个名为 io.js 的库来模块化 socketio 设置,如下所示:
module.exports = function(server)
var io = require('socket.io')(server);
// catch errors
io.on('error', function(err)
throw err;
)
// Set Socket.io listeners by creating a socket.io middleware
// attachEventlisteners would live in `/controllers`
io.use(attachEventlisteners);
io.on('connection', function (socket)
// do things
);
return io; // so it can be used in app.js ( if need be )
然后在 app.js 中,我可以在需要时简单地传递 server
:
var io = require('./lib/io')(server);
你不需要在 app.js 中做任何进一步的事情,因为一切都在/lib/io.js
中设置,但如果你愿意,你可以因为返回 io 服务器。
【讨论】:
非常感谢@agconti - 我仍在努力在脑海中凝聚在一起。现在 socket.io 包含在 /bin/www 中 - 我可以问在哪里放置我的 io.on('connection'... 代码以模块化方式为每个页面放置(例如“关于”、“联系方式”等)好吗? @doublelateralstickytape 不过,这些确实是独立的问题。如果这两个答案都对您有用,那么最好提出另一个关于模块化 socketio 的问题。这样我们就可以帮助遇到同样问题的其他人。 我需要一些时间来消化您的回复并确保我理解它;但我非常感谢您花时间帮助我 - 再次感谢您@agconti :) @doublelateralstickytape 没问题! 我正在寻找模块化我的套接字 io 实现,但我很困惑。您是否有机会发布io.use(attachEventlisteners);
的示例,以便我可以看到您如何从控制器连接到 io?以上是关于Express-Generator - 包括 socket.io (bin/www)的主要内容,如果未能解决你的问题,请参考以下文章
在 express-generator 中使用 bin 文件而不是 .js 的好处
带有 express-generator 的 Nodejs 应用程序,并尝试添加 primus websocket