NodeJS:我的节点文件依赖于其他文件中的变量

NodeJS: My node files have dependencies on variables in an other file

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

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

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

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

中实例化

鉴于我不知道文件夹中会有什么样的模块,我真的不想将 apphttpServer 发送到每个模块,如果它们只是被需要的话每个 1 个模块。像依赖注入这样的东西会很合适,但是没有太多开销是可能的吗?

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

我通常做的是 app.js 导出 app 这样我应用程序中其他地方的模块就可以直接需要它,而不必处理到处传递它的问题。我还稍微修改了 app.js,这样它就不会 "listen" 如果以后需要它作为一个模块,如果我决定用另一个应用程序包装它,我可以进行最小的更改。这对你的问题并不重要,我只是发现它在单元测试时给了我更多的控制权。下面的代码你真正需要的是 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);
}

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

  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
     }