bac*_*esk 6 javascript node.js express socket.io
我试图了解ExpressJS和Socket.IO.我的路由在一个单独的文件中,我从app.js中包含:
var express = require('express')
, db = require('./db')
, mongoose = require('mongoose')
, models = require('./models/device')
, http = require('http')
, path = require('path')
, app = express()
, server = http.createServer(app)
, io = require('socket.io').listen(server)
, routes = require('./routes/myRoutes');
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试从我的一个路由发出一个事件时,我没有引用socket.io.
exports.update = function(req, res){
return Item.findById(req.params.id, function(err, item) {
// Do some checks and save.
socket.emit('updated');
}
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么这可能不可用.相反,我不明白获取socket.io句柄的最佳方法是从app.js以外的其他文件.我正在看这个问题(见里卡多的回答),但我还不清楚.理想情况下,我想避免这样做:
routes = requires("routes/myRoutes")(io);
那么你真的不需要express.io.最简单的解决方案是导出一个新模块并将其传递给socket.io实例.所以在你的app.js中你有:
var express = require('express'),
...
, server = http.createServer(app)
, io = require('socket.io').listen(server)
, routes = require('./routes/myRoutes');
Run Code Online (Sandbox Code Playgroud)
现在需要一个新模块并将其传递给socketio参考.添加此新行(在app.js中)来执行此操作:
require('./app/path/to/your/socketio/controller/socketio')(io);
Run Code Online (Sandbox Code Playgroud)
然后在path/to/your/socketio/controller被调用的socketio.js中创建一个新文件
最后在socketio.js文件中,导出新模块:
module.exports = function(io) {
io.sockets.on('connection', function (socket) {
socket.on('captain', function(data) {
console.log(data);
socket.emit('america');
});
});
};
Run Code Online (Sandbox Code Playgroud)
你去吧!
它具有实时请求的路由,以及一系列其他有用的功能.
app = require('express.io')()
app.http().io()
app.io.route('example', function(req) {
// do something interesting
}))
app.listen(7076)
Run Code Online (Sandbox Code Playgroud)
至于绕过必须传递io对象.您有几个选项,根据您的要求,可能会也可能不会"最佳".
io或app全球.(有些人对全局变得惊慌失措)module.exports和require其他文件中的对象.(如果没有正确完成,可能会导致循环依赖问题)传递io对象可能是最简单的方法,但你确实有选择.
| 归档时间: |
|
| 查看次数: |
12327 次 |
| 最近记录: |