簡體   English   中英

如何使對象引用在Node模塊中可用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM