express 和 socket.io:将 var io 传递给路由器
express and socket.io: pass var io to router
我花了最后几个小时弄清楚如何将 socket.io 与 express 路由器结合起来
我正在努力 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;
}
我花了最后几个小时弄清楚如何将 socket.io 与 express 路由器结合起来 我正在努力 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;
}