[英]How to make object references available in Node modules?
我有一個Express.js網絡應用程序。 在主app.js
文件中,我require()
一堆第三方依賴項。 最近,我開始將app.js
代碼的一部分提取到單獨的模塊中,例如
// in app.js
var users = require('./modules/users');
// and then e.g.
// users.add(doc);
在模塊內部,有時我需要使用主app.js
文件中可用的對象,並且我想知道將對這些對象的引用傳遞給模塊的最佳方法是什么。
我目前的做法:
// in app.js
// pass needed object references in initialization step
users.init([db, logger]);
和
// in modules/users.js
var db, logger;
exports.init = function (deps) {
db = deps[0];
logger = deps[1];
};
這種方法有意義嗎? 有更好的方法來執行此操作嗎?
當然,只需使用模塊! :)
// db.js
// create db instance here rather than in app.js
module.exports = db;
和
// logger.js
// create logger instance here rather than in app.js
module.exports = logger;
然后
// app.js
var db = require('./db');
和
// lib/somewhere.js
var db = require('../db');
這樣,您就可以依靠CommonJS依賴項注入系統,而不是一個人自己進行依賴項注入(傳遞引用而不是require
在您的模塊中require
傳遞)。
之所以能夠按預期工作,是因為模塊僅被解釋一次,因此,如果您實例化所有內容一次而不是使用工廠函數,那么它就可以工作。
你應該只能夠require
模塊正常:
// users.js
var db = require('./db');
exports.init = function() {
// use db in here
};
但是,有時這是不可能的,您將需要顯式傳遞模塊。 一種方法是在require
模塊時傳遞依賴項:
// users.js
module.exports = function(db, logger) {
return {
init: function() { /* use db and logger in here */}
};
}
// app.js
var db = ...;
var logger = ...;
var users = require('./users')(db, logger);
users.init();
這是我個人更喜歡的模式,我認為將依賴項傳遞到require中比將示例中的init方法傳遞給它更干凈。
您會在ExpressJS代碼中看到很多這樣的事情,例如,當我們將所有路由都放在另一個文件中並且需要傳遞我們的app
實例時:
require('./routes')(app);
如果您需要在app.js
專門初始化而不是自己的模塊初始化,則可以從app.js
導出它們,然后需要app.js
:
// app.js
var db = require("db"),
logger = require("logger");
// do your initialization with db and logger
module.exports = { db: db, logger: logger };
接着:
// users.js
var db = require("./app").db,
logger = require("./app").logger;
// use db and logger
之所以起作用,是因為正如@Nico所提到的,模塊只被解釋一次,而app.js
不會在每次其他地方都需要時被解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.