【问题标题】:How do you export a variable from app.js into another route in Node js如何将 app.js 中的变量导出到 Node js 中的另一个路由
【发布时间】:2014-12-31 17:20:15
【问题描述】:

我在我的节点项目中使用 socket.io,想知道如何导出 io 变量

这是我到目前为止所做的,但我收到了这个错误:Object #<Object> has no method 'on'

在 app.js 中:

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

var routes = require('./routes/index')(io);
var users = require('./routes/user');

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(4000);

require('./routes/index')(io);

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// app.use(favicon(__dirname + '/public/img/favicon.ico'));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);
app.use('/users', users);

/// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
    app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: err,
            title: 'error'
        });
    });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
        message: err.message,
        error: {},
        title: 'error'
    });
});
/*
io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});
*/

module.exports = app;

在 index.js 中

var io = require('../app');

io.on('connection', function (socket) {
  socket.emit('news', { hello: 'world' });
  socket.on('my other event', function (data) {
    console.log(data);
  });
});

我想要导出变量的原因是我不必像在 app.js 中那样定义 io 是 index.js,这导致我基本上同时定义了服务器和应用程序变量!

我只想在 index.js 路由中完成所有 socket.io 的工作(除了必须在 index.js 中重新定义 app、server 和 io 变量)!

希望我已经充分解释了我自己

谢谢!

【问题讨论】:

  • 我正在使用 express 框架,所以我想我会这样做
  • 我的意思是 app.js 需要 index.js 而 index.js 需要 app.js。此外,在您有机会初始化应用程序之前,似乎需要索引。我认为这是一个先有鸡还是先有蛋的问题
  • 对于 node js 来说还是个新手。这就是 yomean 生成文件的方式,实际上并没有在 app.js 中做任何事情。请问我该如何解决?
  • 好的,我添加一个答案来重构可能会解决问题的代码,敬请期待! ;)

标签: node.js express socket.io


【解决方案1】:

您的依赖项设置不正确。您在 io 初始化之前执行 index.js

var routes = require('./routes/index');
/* index.js starts being executed at this point
 * hence, io is undefined inside index.js
 */

相反,你为什么不试试

app.js

var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(4000);
module.exports = io;

var routes = require('./routes/index');
var users = require('./routes/user');

index.js

 var io = require('../app');

io.on('connection', function (socket) {
    socket.emit('news', { hello: 'world' });
    socket.on('my other event', function (data) {
    console.log(data);
    });
});

【讨论】:

    【解决方案2】:

    我认为您需要使用套接字。

    io.sockets.on('connection', ... ); 
    

    【讨论】:

    • 在 index.js 中添加了它并得到了Cannot call method 'on' of undefined
    【解决方案3】:

    看起来像一个循环依赖(app.js 需要 index.js 而 index.js 需要 app.js)

    试试这个。

    将 app.js 更改为:

    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');
    
    var users = require('./routes/user');
    
    var app = require('express')();
    var server = require('http').Server(app);
    var io = require('socket.io')(server);
    server.listen(4000);
    
    require('./routes/index')(io);
    
    // view engine setup
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    
    // app.use(favicon(__dirname + '/public/img/favicon.ico'));
    app.use(logger('dev'));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({
      extended: true
    }));
    app.use(cookieParser());
    app.use(express.static(path.join(__dirname, 'public')));
    
    app.use('/users', users);
    
    /// catch 404 and forward to error handler
    app.use(function(req, res, next) {
      var err = new Error('Not Found');
      err.status = 404;
      next(err);
    });
    
    /// error handlers
    
    // development error handler
    // will print stacktrace
    if (app.get('env') === 'development') {
      app.use(function(err, req, res, next) {
        res.status(err.status || 500);
        res.render('error', {
          message: err.message,
          error: err,
          title: 'error'
        });
      });
    }
    
    // production error handler
    // no stacktraces leaked to user
    app.use(function(err, req, res, next) {
      res.status(err.status || 500);
      res.render('error', {
        message: err.message,
        error: {},
        title: 'error'
      });
    });
    /*
     io.on('connection', function (socket) {
     socket.emit('news', { hello: 'world' });
     socket.on('my other event', function (data) {
     console.log(data);
     });
     });
     */
    
    module.exports = app;
    

    将 index.js 更改为:

    module.exports = function(io){
      io.on('connection', function (socket) {
        socket.emit('news', { hello: 'world' });
        socket.on('my other event', function (data) {
          console.log(data);
        });
      });
    }  
    

    【讨论】:

    • 给我这个错误/Desktop/blah Site/node_modules/express/lib/router/index.js:114 debug('dispatching %s %s', req.method, req.url); :(
    • 我已经用 app.js 中的完整代码更新了我的问题
    • 您没有完全按照我指定的方式更改代码。我看到require('./routes/index')(io) 两次和一次之前io 甚至被定义。删除第一个版本。
    • 同时删除app.use('/', routes);这一行
    • 完全按照你说的做,现在得到这个错误/node_modules/express/lib/router/index.js:116 var method = req.method.toLowerCase();
    【解决方案4】:

    在 app.js 中使用“global.io”而不是“var io”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多