首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Express4和Express -generator的/bin/www中使用socket.io

在Express4和Express -generator的/bin/www中使用socket.io
EN

Stack Overflow用户
提问于 2014-07-07 19:54:34
回答 2查看 59.3K关注 0票数 95

事情是这样的:我正尝试在一个express项目中使用socket.io。在ExpressJs4发布后,我更新了我的express-generator,现在app的初始函数进入了./bin/www文件,包括那些var (www文件内容:http://jsfiddle.net/avMa5/ )

代码语言:javascript
复制
var server = app.listen(app.get('port'), function() {..}

(先用npm install -g express-generator,然后用express myApp检查

话虽如此,让我们记住socket.io文档是如何要求我们触发它的:

代码语言:javascript
复制
var app = require('express').createServer();
var io = require('socket.io')(app);

好的,但是我不能像推荐的那样在app.js中做这件事。这应该在./bin/www中完成才能工作。在./bin/www中,我可以执行以下操作来使其工作:

代码语言:javascript
复制
var io = require('socket.io')(server)

好的,这行得通,但是我不能在其他地方使用io变量,而且我真的不想把我的socket.io函数放在www文件上。

我猜这只是基本的语法,但我不能让它工作,甚至不能在www文件上使用module.exports = serverserver.exports = servermodule.exports.io = app(io)

所以问题是:我如何使用这个/bin/www文件作为我的应用程序的起点的socket.io?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-07 20:30:32

事实证明,这确实是一些基本的汉税问题……我从 this socket.io chat tutorial那里得到这些台词。

在./bin/www上,紧跟在var server = app.listen(.....)之后

代码语言:javascript
复制
var io = require('socket.io').listen(server);
require('../sockets/base')(io);

因此,现在我创建了../socket/base.js文件,并将这个小家伙放入其中:

代码语言:javascript
复制
module.exports = function (io) { // io stuff here... io.on('conection..... }

嗯!现在它起作用了..。因此,我想我真的别无选择,只能在/bin/www中启动socket.io,因为我的http服务器就是在那里启动的。目标是现在我可以通过require('fileHere')(io);在其他文件中构建套接字功能,同时保持模块化

<3

票数 44
EN

Stack Overflow用户

发布于 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”对象上

代码语言:javascript
复制
app.io = require('socket.io')();

通过将socket.io附加到"bin/www“中的服务器,使其处于活动状态

代码语言:javascript
复制
app.io.attach(server); 

因为"app“对象在前面传入了"bin/www”

代码语言:javascript
复制
app = require("../app");

真的很简单,就像

代码语言:javascript
复制
require('socket.io')().attach(server);

但是使用“困难”的方法可以确保app.io现在可以保存socke.io对象。

现在,如果您还需要在“socket.io /index.js”中使用此路由对象,则只需使用相同的原则传递该对象即可。

在"app.js“中,第一个是do

代码语言:javascript
复制
app.use('/', require('./routes/index')(app.io));

然后在"routes/index.js“中

代码语言:javascript
复制
module.exports = function(io){
    //now you can use io.emit() in this file

    var router = express.Router();



    return router;
 }

所以"io“被注入到"index.js”中。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24609991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档