我正在使用nodejs创建一个应用程序。在应用程序中,我有一个app.js
脚本,它是初始化应用程序,作为快速应用程序和我使用的http服务器的入口点。
只是为了澄清:这里的模块不是npm模块,它们是我自己的文件。我已经在模块中编写了应用程序。它们只是require()
使用的单独脚本文件。
这个应用程序有几个模块,主模块处理程序初始化。它读取包含我自己的模块的文件夹的内容,然后在没有.initialize
扩展名的文件名上运行require()
调用后,按照惯例调用每个模块上的.js
。 / p>
但是,我有1个模块需要app
变量来创建端点,1个模块需要httpServer
变量来创建Web套接字。这两个都在app.js
中实现。
由于我不知道文件夹中会包含哪些模块,因此我不想将app
和httpServer
发送到每个模块,如果它们只是需要1个模块。像依赖注入这样的东西会很合适,但这可能没有太大的开销吗?
现在我暂时将app
和httpServer
暂时添加到GLOBAL
对象。
答案 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个文件
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);
socketini.js
module.exports = function(server){
//your socket initilize goes here
var io = require('socket.io').listen(server);
}
xyz.js
module.exports = function(app){
//you can access app here
}