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
.
中实例化
鉴于我不知道文件夹中会有什么样的模块,我真的不想将 app
和 httpServer
发送到每个模块,如果它们只是被需要的话每个 1 个模块。像依赖注入这样的东西会很合适,但是没有太多开销是可能的吗?
现在我只是暂时将 app
和 httpServer
添加到 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
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
}
我正在用 nodejs 创建一个应用程序。在应用程序中,我有一个 app.js
脚本,它是初始化应用程序(作为 expressjs 应用程序)和我使用的 http 服务器的入口点。
澄清一下:这里的模块不是npm模块,是我自己的文件。我已经在模块中编写了应用程序。它们只是 require()
-ing 使用的单独脚本文件。
此应用程序有几个模块,主模块处理程序会对其进行初始化。它读取包含我自己的模块的文件夹的内容,然后按照惯例在 运行 之后调用每个模块上的 .initialize
对文件名的 require()
调用没有 .js
扩展。
但是,我有 1 个模块需要 app
变量来创建端点,还有 1 个模块需要 httpServer
变量来创建网络套接字。这两个都在 app.js
.
鉴于我不知道文件夹中会有什么样的模块,我真的不想将 app
和 httpServer
发送到每个模块,如果它们只是被需要的话每个 1 个模块。像依赖注入这样的东西会很合适,但是没有太多开销是可能的吗?
现在我只是暂时将 app
和 httpServer
添加到 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
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 }