我搞乱了socketIO,目前我有一个单独的路径文件:
//api.js
var express = require('express');
var router = express.Router();
router.get('/test', function (req, res) {
io.sockets.emit("change", {message: "this is a test"}); //io is NOT referenced!!!
response.send(200);
});
module.exports = router;
我的io
中引用了server.js
,如此
var express = require('express');
var io = require('socket.io');
var app = express(),
server = require('http').createServer(app).listen(8080),
io = io.listen(server);
在使用socketIO之前,我包含了api路由文件,所有路由都带有/api
这样的前缀:
var api = require('./server/routes/api');
app.use('/api', api);
问题:如何将对socketIO io
的引用传递给路由文件?
答案 0 :(得分:1)
有很多方法可以做到这一点。你可以直接将你的实例传递给你的路线:
// api.js
var express = require('express');
var router = express.Router();
var io;
router.get('/test', function (req, res) {
io.sockets.emit("change", {message: "this is a test"});
response.send(200);
});
module.exports = function(sio) {
io = sio;
return router;
};
// server.js
var api = require('./server/routes/api');
app.use('/api', api(io));
或者你可以将你的socket.io实例放在一个单独的文件中require()
在任何需要socket.io实例的文件中。
答案 1 :(得分:0)
api
前缀与之无关。
(非常)粗略地看起来像这样:
<强> api.js 强>
var router = require('express').Router();
module.exports = function(io) {
router.get('/test', function (req, res) {
io.sockets.emit("change", {message: "this is a test"});
response.send(200);
});
return router;
};
server.js片段
var api = require('./server/routes/api')(io);
app.use('/api', api);
您不需要在模块级别仅公开该函数,例如,您可以公开init
函数,就像普通模块公开函数一样:
<强> api.js 强>
exports.init = function (io) {
router.get('/test', function (req, res) {
io.sockets.emit("change", {message: "this is a test"});
response.send(200);
});
return router;
};
server.js片段
var api = require('./server/routes/api');
app.use('/api', api.init(io));
我远离了我可以测试的任何东西,但简单的解释是你要公开一个接受io
变量的函数。在该函数io
内部,您可以传入任何内容。