node.js - Express 和 socket.io : pass var io to router

标签 node.js express socket.io

过去几个小时我一直在研究如何将 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');
});

我的 secret 路由器:

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 中,而是将其放在 secret 路由器中。但只要将它放入 secret 路由器中就会出现错误,提示 io 未定义。

所以我需要以某种方式将 io var 传递给路由器。

编辑:

在我的 app.js 中我更改了: var SecretRouter = require('./routes/secret');

至:

var secretRouter = require('./routes/secret')(io);

在我的 secret 路由器中:

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);

然后在 secret 路由器中捕获它

module.exports = function(io) { // catch here

    var express = require('express');
    var router  = express.Router();

    // ...routes

    return router;
}

关于node.js - Express 和 socket.io : pass var io to router,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34695610/

相关文章:

node.js - Express.js 和 Socket.io

node.js - 代理 Node 应用程序中的所有 Sentry 请求

Node.js - 使用 Express 获取原始请求正文

express:扩展 Express.Request 的项目本地中间件

node.js - MongoDB 字段返回一个数字,但使 javascript 变量未定义

node.js - 多个 socket.io 服务器共享单个 HTTP/S 服务器

multithreading - Node JS 是否限制每个打开的 HTTP 连接只有一个线程?

javascript - Pug用户名插值问题

javascript - 在 map() 之后只调用一次函数

php - Laravel 回显服务器无法在生产服务器中运行