【问题标题】:pass socketio reference between layers in express4在express4中的层之间传递socketio引用
【发布时间】:2015-11-23 22:10:53
【问题描述】:

我刚刚开始使用 websockets 和 express,但我似乎无法让它与我当前的架构一起工作。

我在另一个问题中看到在我声明我的路线之前要执行以下操作

//this goes prior to your route registration
app.use(function(req, res, next) {
    req.io = io;
});

但我什至不确定如何将 io 传递给我的应用程序 js 以使用上面的代码 sn-p。

我有我的 bin/www:我相信这是在 express4 中引入的?套接字在这里连接良好

#!/usr/bin/env node

/**
 * Module dependencies.
 */

var app = require('../app');
var debug = require('debug')('server:server');
var http = require('http');

/**
 * Get port from environment and store in Express.
 */

var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);

/**
 * Create HTTP server.
 */

var server = http.createServer(app);

/**
 * attach socket to express
 */
var io = require('socket.io').listen(server);

/**
 * Listen on provided port, on all network interfaces.
 */

server.listen(port);
server.on('error', onError);
server.on('listening', onListening);


io.sockets.on('connection', function() {
  console.log('!!!sockets io connected!!!');
})

/**
 * Normalize a port into a number, string, or false.
 */

function normalizePort(val) {
  var port = parseInt(val, 10);

  if (isNaN(port)) {
    // named pipe
    return val;
  }

  if (port >= 0) {
    // port number
    return port;
  }

  return false;
}

我的 app.js。这是我想使用第一个代码sn-p的地方吗?但我不确定如何将“io”传递给这个文件

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');

/**
 * Route Imports
 */

var app = express();

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());

//THIS IS WHERE I WOULD PUT IT???? assuming I can pass IO into this??
app.use(function(req, res, next) {
    req.io = io;
});

/**
 * Routes
 */
var router = require('./router')(app);

module.exports = app;

路由器 index.js

/**
 * The Index of Routes
 */

module.exports = function (app) {

  app.use('/test', require('./routes/test'));
}

最后是路线,我假设一旦我在 app.js 中获得第一个 sn-p,这将起作用,因为它将附加到 req?

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

router.get('/', function (req, res) {
   //I WANT SOCKET TO JUST RESPOND WITH ANYTHING BUT I CANT GET 
   //AN INSTANCE OF IO IN HERE
   req.io.emit('test', 'hihi');
});

router.post('/', function (req, res) {
  test.save(function (err) {

    if (err) {
      console.log(err);
      res.status(500).json({
        'message': 'error'
      });
    } else {
      // Log success
      console.log('Success');
      req.io.emit('test:added', test);
      res.status(201);
    }

  });
});
module.exports = router;

**注意:为了可读性删除了很多代码**

【问题讨论】:

    标签: javascript node.js express websocket


    【解决方案1】:

    主模块:

    var app = express();
    // ...
    var server = http.createServer(app);
    // ...
    var io = require('socket.io').listen(server);
    
    // ...
    
    app.use(function (req, res, next) {
      req.io = io;
    })
    
    require('../app')(app); 
    require('../routes')(app);    
    

    您的应用模块公开了app 实例,因此如果您有权访问io,则可以在主模块中使用它。很简单。

    【讨论】:

    • 我无法读取未定义的属性“发射”。我想我应该在注册我的路线之前做 req io 吗?哪些是在 app.js 中完成的?
    • 是的,首先是io,然后是路由。
    • 我知道,但这是在 var app = require('../app');我需要将该行放在 app.js vs bin/www 中。您上面显示的代码告诉我将其粘贴在 bin/www 中,在注册路线之前我不能这样做
    • 然后在 io 中间件下面的主文件中调用router(app)。或者更好的是,在您的主文件中创建 var app = express(),然后将引用传递给 router 和您的旧 app.js 或任何其他将在您的应用实例上设置中间件的模块。
    • 重构了示例以显示我的意思。当我在主文件中创建快速应用程序时,它应该让您更好地了解正在发生的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多