事情是这样的:我正尝试在一个express项目中使用socket.io。在ExpressJs4发布后,我更新了我的express-generator,现在app的初始函数进入了./bin/www
文件,包括那些var (www文件内容:http://jsfiddle.net/avMa5/ )
var server = app.listen(app.get('port'), function() {..}
(先用npm install -g express-generator
,然后用express myApp
检查
话虽如此,让我们记住socket.io文档是如何要求我们触发它的:
var app = require('express').createServer();
var io = require('socket.io')(app);
好的,但是我不能像推荐的那样在app.js中做这件事。这应该在./bin/www中完成才能工作。在./bin/www中,我可以执行以下操作来使其工作:
var io = require('socket.io')(server)
好的,这行得通,但是我不能在其他地方使用io变量,而且我真的不想把我的socket.io函数放在www
文件上。
我猜这只是基本的语法,但我不能让它工作,甚至不能在www文件上使用module.exports = server
或server.exports = server
或module.exports.io = app(io)
所以问题是:我如何使用这个/bin/www文件作为我的应用程序的起点的socket.io?
发布于 2014-07-07 20:30:32
事实证明,这确实是一些基本的汉税问题……我从 this socket.io chat tutorial那里得到这些台词。
在./bin/www上,紧跟在var server = app.listen(.....)
之后
var io = require('socket.io').listen(server);
require('../sockets/base')(io);
因此,现在我创建了../socket/base.js文件,并将这个小家伙放入其中:
module.exports = function (io) { // io stuff here... io.on('conection..... }
嗯!现在它起作用了..。因此,我想我真的别无选择,只能在/bin/www中启动socket.io,因为我的http服务器就是在那里启动的。目标是现在我可以通过require('fileHere')(io);
在其他文件中构建套接字功能,同时保持模块化
<3
发布于 2015-02-27 08:01:49
旧的"expressjs",所有的事情都发生在"app.js“文件中。因此,到服务器的socket.io绑定也发生在该文件中。(顺便说一句,人们仍然可以用旧的方法,并删除bin/www)
现在有了新的expressjs,它需要出现在"bin/www“文件中。
幸运的是,javascript/requirejs使得传递对象变得很容易。正如Gabriel Hautclocq所指出的,socket.io仍然在"app.js“中被”导入“,并且它通过一个属性被附加到"app”对象上
app.io = require('socket.io')();
通过将socket.io附加到"bin/www“中的服务器,使其处于活动状态
app.io.attach(server);
因为"app“对象在前面传入了"bin/www”
app = require("../app");
真的很简单,就像
require('socket.io')().attach(server);
但是使用“困难”的方法可以确保app.io
现在可以保存socke.io对象。
现在,如果您还需要在“socket.io /index.js”中使用此路由对象,则只需使用相同的原则传递该对象即可。
在"app.js“中,第一个是do
app.use('/', require('./routes/index')(app.io));
然后在"routes/index.js“中
module.exports = function(io){
//now you can use io.emit() in this file
var router = express.Router();
return router;
}
所以"io“被注入到"index.js”中。
https://stackoverflow.com/questions/24609991
复制相似问题