express和socket.io:将var io传递给路由器
我花了最后几个小时搞清楚如何将socket.io与高速路由器相结合我试图让socket.io工作。
这是我使用的软件包:
"express": "~4.9.0", "ejs": "~0.8.5", "socket.io":"~1.3.3"
我的app.js:
// loading modules var express = require('express'); var http = require('http'); var app = express(); var server = http.createServer(app); var io = require('socket.io').listen(server); //routers var secretRouter = require('./routes/secret'); // Setup serving static assets app.use(express.static('public')); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // Setup initial routing - index app.use('/', secretRouter); // Start the server server.listen(3000, function(){ console.log('App listening at http://localhost:3000'); });
我的秘密路由器:
var express = require('express'); var router = express.Router(); // Show the login form router.get('/login', function(req, res, next) { res.locals.req = req; res.render('secret/login'); }); // If someone tries to login router.post('/login', function(req, res, next) { username = req.body.username; password = req.body.password; req.getConnection(function(err, connection){ connection.query('SELECT * FROM users WHERE name = ? AND password = ?',[username, password], function(err, results) { res.locals.data = results; if (results.length > 0){ req.session.regenerate(function(){ req.session.login = true; req.session.username = req.body.username; res.redirect(req.baseUrl); }); }else { console.log('wachtwoord of naam is fout'); res.redirect(req.baseUrl); } }); }); }); module.exports = router;
这一切工作正常。
我可以添加一个io连接函数,让我知道如果有人在app.js中打开这样的网站:
io.on('connection', function(socket){ console.log('a user connected'); });
但现在,而不是在app.js上面的代码,我想在秘密路由器。 但只是把它放在秘密路由器会给我一个错误,说io没有定义。
所以不知何故,我需要将io var传递给路由器。
编辑:
在我的app.js我改变了:var secretRouter = require('./ routes / secret');
至:
var secretRouter = require('./routes/secret')(io);
并在我的秘密路由器:
module.exports = function(io) { // catch here var express = require('express'); var router = express.Router(); return router; } // Show the login form router.get('/login', function(req, res, next) { res.locals.req = req; res.render('secret/login'); }); // If someone tries to login router.post('/login', function(req, res, next) { username = req.body.username; password = req.body.password; req.getConnection(function(err, connection){ connection.query('SELECT * FROM users WHERE name = ? AND password = ?',[username, password], function(err, results) { res.locals.data = results; if (results.length > 0){ req.session.regenerate(function(){ req.session.login = true; req.session.username = req.body.username; res.redirect(req.baseUrl); }); }else { console.log('wachtwoord of naam is fout'); res.redirect(req.baseUrl); } }); }); }); module.exports = router;
但是现在我得到了路由器没有定义的错误
你可以通过它
var io = require('socket.io').listen(server); var secretRouter = require('./routes/secret')(io); // pass here app.use('/', secretRouter);
然后在秘密路由器中捕获它
module.exports = function(io) { // catch here var express = require('express'); var router = express.Router(); // ...routes return router; }