NodeJS:我的节点文件依赖于另一个文件中的变量

时间:2015-07-17 13:55:53

标签: javascript node.js express dependencies

我正在使用nodejs创建一个应用程序。在应用程序中,我有一个app.js脚本,它是初始化应用程序,作为快速应用程序和我使用的http服务器的入口点。

只是为了澄清:这里的模块不是npm模块,它们是我自己的文件。我已经在模块中编写了应用程序。它们只是require()使用的单独脚本文件。

这个应用程序有几个模块,主模块处理程序初始化。它读取包含我自己的模块的文件夹的内容,然后在没有.initialize扩展名的文件名上运行require()调用后,按照惯例调用每个模块上的.js。 / p>

但是,我有1个模块需要app变量来创建端点,1个模块需要httpServer变量来创建Web套接字。这两个都在app.js中实现。

由于我不知道文件夹中会包含哪些模块,因此我不想将apphttpServer发送到每个模块,如果它们只是需要1个模块。像依赖注入这样的东西会很合适,但这可能没有太大的开销吗?

现在我暂时将apphttpServer暂时添加到GLOBAL对象。

2 个答案:

答案 0 :(得分:0)

我通常做的是app.js导出app,以便我的应用中的其他模块可以直接使用它,而不必处理在任何地方传递它。我还稍微修改了app.js,以便它不会“监听”如果我以后需要作为一个模块,如果我决定用另一个应用程序包装它,我可以进行最小的更改。这对你的问题并不重要,我发现它在单元测试时给了我更多的控制权。以下代码中您真正需要的只是module.exports = app

'use strict';
var express = require('express'),
  app = express(),
  config = require('config'),
  pkg = require('./package.json');

// trust reverse proxies
app.enable('trust proxy');

app.set('version', pkg.version);
module.exports = app; // <--- *** important ***

if (app.get('env') !== 'production') {
  app.set('debug', true);
}

// calling app.boot bootstraps the app
app.boot = function (skipStart) { // skipStart var makes it easy to unit test without actually starting the server
  // add middleware
  require('./middleware/');

  // setup models
  app.set('models', require('./models'));

  // setup routes
  require('./routes/');

  // wait for a dbconnection to start listening
  app.on('dbopen', function () {

    // setup hosting params
    if (!skipStart) {
      let server = app.listen(config.port, function () {
        app.emit('started');
        console.log('Web Server listening at: http://%s:%s', server.address().address, server.address().port);

        // mail server interceptor for dev
        if (app.get('env') !== 'production') { 
          // Config smtp server for dev
          let SMTPServer = require('smtp-server').SMTPServer,
            mailServer = new SMTPServer({
              secure: false,
              disabledCommands: ['STARTTLS'],
              onData: function(stream, session, callback){
                stream.pipe(process.stdout); // print message to console
                stream.on('end', callback);
              },
              onAuth: function (auth, session, callback) {
                callback(null, {user: 1, data: {}});
              }
            });
          // Start smtp server
          mailServer.listen(1025, '0.0.0.0');
        } else {
          // start agenda jobs only on production
          require('./jobs.js');
          console.log('Agenda Jobs Running.');
        }
      });
    } else {
      app.emit('booted');
    }
  });
};

// If this is the main module, run boot.
if (require.main === module) {
  // move all of this to next tick so we can require app.js in other modules safely.
  process.nextTick(app.boot);
}

答案 1 :(得分:0)

假设您要从主app.js初始化2个文件

  1. app.js

    var socketIni = require('./socketini.js');//You have to pass server
    var xyz  = require('./xyz.js')//you have to pass app
    var app = express();
    var server=http.createServer(app);
    socketIni(server);
    xyz(app);
    
  2. socketini.js

    module.exports = function(server){
       //your socket initilize  goes here
      var io = require('socket.io').listen(server);
    }
    
  3. xyz.js

     module.exports = function(app){
       //you can access app here
     }