[英]XMLHttpRequest cannot load with Socket.io in ExpressJS
[英]ExpressJS - Socket.IO with Route Separation
我试图了解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');
但是,当我尝试从我的一个路由发出一个事件时,我没有引用socket.io。
exports.update = function(req, res){
return Item.findById(req.params.id, function(err, item) {
// Do some checks and save.
socket.emit('updated');
}
}
我理解为什么这可能不可用。 相反,我不明白获取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');
现在需要一个新模块并将其传递给socketio参考。 添加此新行(在app.js中)来执行此操作:
require('./app/path/to/your/socketio/controller/socketio')(io);
然后在你的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');
});
});
};
你去吧!
它具有实时请求的路由,以及一系列其他有用的功能。
app = require('express.io')()
app.http().io()
app.io.route('example', function(req) {
// do something interesting
}))
app.listen(7076)
至于绕过必须通过io
对象。 您有几个选项,根据您的要求,可能会也可能不会“最佳”。
io
或app
全球化。 (有些人对全局变得惊慌失措) module.exports
并require
另一个文件中的对象。 (如果没有正确完成,可能会导致循环依赖问题) 传递io
对象可能是最简单的方法,但你确实有选择。
socket.io不适用于路由,它适用于套接字。
您将此代码添加到app.js或您在app.js中包含的单独文件:
io.sockets.on('connection', function (socket) {
socket.on('update', function (your_id) {
Item.findById(your_id, function(err, item) {
socket.emit('send_update', item);
}
});
});
您的更新路线仅使用javascript呈现html文档,其中包含:
<script src="/socket.io/socket.io.js"></script>
<script>
var socket = io.connect('http://localhost');
socket.emit('update', { your_id: '1' });
socket.on('send_update', function (data) {
console.log(data);
});
</script>
因此,一旦页面呈现并完成,client-javascript将打开一个到服务器的套接字并接收其他数据。
免责声明:代码从头开始编写,未经过测试。
最好的方法是使用闭包。 例如:
exports.update = function(socket){
return function(req, res) {
//In here now you can have the reference to the socket io
Item.findById(req.params.id, function(err, item) {
// Do some checks and save.
socket.emit('updated');
}
}
}
和:
app.post('/your_path', update(io));
我使用过Expressjs的中间件路由器(我使用的是4.x)。
在外部路由文件中,我放了“下一个”对象:
module.exports = function(app, settings){
app.post('/something', function(req, res, next) {
...
next();
}
};
在主文件中,我在io.on('connection')中写下最后一个路径:
io.on('connection', function (socket) {
// Final route for middlewares who need to interact with socket.io
app.post('/something', function (req, res, next) {
socket.emit('event', { result: 'ok' });
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.