如何在express的路由中操作socket.io
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在express的路由中操作socket.io相关的知识,希望对你有一定的参考价值。
参考技术A 最近,遇到一个问题需要在 express 路由中操作 socket ,而网上的例子基本上是在主文件操作 socket 。给 router 添加一个 io 函数,接收参数 io ( io 是引入的 socket.io 库)。
咱把 router 导出,在 app.js 中导入,然后把 router.io 赋给 app.io 。
最后,在 bin/www 中导入 socket.io 并调用 app.io 。
现在 chat.js 中的 router.io 成功接收到导入的 socket 。
可能有人会有疑惑,怎么不直接在 chat.js 中直接导入 socket.io ?
用 express-generator 生成的 express 项目,目录结构如下
express项目目录结构
http 模块是在 bin/www 下导入并生成 server ,而 socket.io 基于 http (socket.io的参数就是server),所以网上的示例大多数是写在该文件里。
如果对你有帮助,请给个❤。
Socket.io express 不同的路由
【中文标题】Socket.io express 不同的路由【英文标题】:Socket.io express different routing 【发布时间】:2015-09-28 09:26:18 【问题描述】:我正在尝试在最新的 express 版本上使用 Socket.IO,但没有成功。 我想在特定的 js 文件上使用 Socket.IO 功能,使用“路由器”而不是“app.js”,即全局文件。
另外,我希望服务器端与客户端不同。
这是我的代码:
服务器端,一个名为“addPost.js”的文件,位于“routes”文件夹中:
router.get('/', function(req, res, next)
io.on('connection', function (socket)
socket.emit('news',
hello: 'world'
);
socket.on('my other event', function (data)
console.log(data);
);
);
res.render('addPost');
);
客户端,一个名为“index.ejs”的文件位于“views”文件夹中,它与“addPost.js”无关:
<script src="https://cdn.socket.io/socket.io-1.3.5.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script>
var socket = io.connect('http://localhost:3000/');
socket.on('news', function (data)
console.log(data);
socket.emit('my other event', my: 'data' );
);
</script>
我怎样才能在它们之间建立联系??
【问题讨论】:
将 io.on('connection'... 放在 router.get.... 内没有意义。io.on(...) 只需要运行一次,你每次运行它有人到达您的路由的时间。您应该将套接字逻辑与路由器分开,因为它们不相关,尽管它们可能使用相同的数据。 @Molda,您能详细说明您的评论吗?具体来说,将套接字逻辑与路由器分开?我遇到了类似的问题,我不确定如何在 server.js 中设置连接后访问其他路由上的套接字。理想情况下,应该有一个 res.socket 对象来向客户端发出事件,但我还没有找到这样的功能。 @JonathanKempf 检查我的答案 【参考方案1】:你需要让socket监听服务器的端口。在 addPost.js 中像这样:
function listenServer()
io = require('socket.io').listen(server)
如果您不想在您的应用程序文件中执行此操作,您应该将链接发送到您的服务器到套接字。在你的 app.js 中有这样的东西:
var server = http.createServer(app);
server.listen(app.get('port'), function()
log.info('Express server listening on port ' + app.get('port'));
);
var socket = require('addPost.js');
socket.listenServer(server);
【讨论】:
【参考方案2】:你不需要把 io.on 放在路由器里面 简单地做这个
router.get('/', function(req, res, next)
res.render('addPost');
// after you render the page
// client will connect to socket
// or if you want to send news along with this request do something like
getNews(function(err, news)
res.render('addPost', news: news);
// obviously you need to render the news in your view
);
);
io.on('connection', function (socket)
// now after the client has recieved page from res.render
// client will connect and can ask for news
socket.on('getNews', function ()
// your logic to get news
getNews(function(err, news)
if(!err) socket.emit('news', news);
);
);
socket.on('my other event', function (data)
console.log(data);
);
);
在客户端脚本中
<script>
var socket = io.connect('http://localhost:3000/');
//ask for news
socket.emit('getNews');
socket.on('news', function (data)
console.log(data);
socket.emit('my other event', my: 'data' );
);
</script>
希望对你有帮助。
【讨论】:
以上是关于如何在express的路由中操作socket.io的主要内容,如果未能解决你的问题,请参考以下文章
text Express 4和Socket.io:将socket.io传递给路由。