簡體   English   中英

Node.js中的“全局”模塊對象

[英]“Global” module object in Node.js

我有一個用於連接到數據庫並執行操作的模塊。

然后在我的主腳本(app.js)中實例化它

var DBConn = require('./common/DBConn');

從該腳本可以正常工作。 但是,然后我有了其他一些處理路由的腳本,並且我想在這些腳本上執行一些DB的工作,但是如果我使用DBConn,它會返回一個錯誤,提示“未定義DBConn”。

然后,我可以在這些其他js文件中實例化另一個DBConn,但這意味着我正在為每個文件創建連接,對嗎? 但是我希望這些其他腳本使用來自app.js的DBConn對象,這樣我就不會不斷地建立與數據庫的連接然后關閉它……(除非這是一個好主意,但是對我來說,它使僅使用一個“全局”對象來處理整個應用程序中的連接就更有意義了。

(順便說一句:我正在使用Express)

您要在每個文件中都需要require()模塊。 節點將緩存模塊。

通常,數據庫連接的上下文在存儲或存儲庫之后被抽象出來,而您的其他模塊則與之交互。 在人們直接需要貓鼬等模塊的情況下,他們將在所有地方都需要貓鼬,但僅在其主應用程序入口點(app.js / server.js / whatever)中調用連接代碼。

https://nodejs.org/api/modules.html#modules_caching

第一次加載模塊后將對其進行緩存。 這意味着(除其他事項外)每次對require('foo')的調用都將返回完全相同的對象,如果它可以解析為相同的文件。

多次調用require('foo')可能不會導致模塊代碼多次執行。 這是一個重要功能。 使用它,可以返回“部分完成”的對象,從而即使在可能導致循環的情況下,也可以加載傳遞依賴。

如果要讓一個模塊多次執行代碼,請導出一個函數,然后調用該函數。

您可以使用單例為您解決此問題。 但是請記住,單身帶着自己的一系列問題(對單身的好discussuon可以在這里找到什么是壞對單身? )。

也就是說,一旦您考慮了單例的優缺點,它們可能是解決此問題的絕妙解決方案。

例:

// database.js
var singleton = function singleton() {

    this.DbConnection = {};

    function setup(database, username, password) {
        this.DbConnection = MakeDbConnection()
    };

};

singleton.instance = null;

singleton.getInstance = function(){
    if(this.instance === null){
        this.instance = new singleton();
    }
    return this.instance;
};

module.exports = singleton.getInstance();

然后可以在應用程序的其他位置調用它,如下所示:

// main.js
var db     = require("./database");

db.setup('db', 'root', 'pass');

db.DbConnection();

第一次調用db.setup()后,數據庫連接僅適用於以下內容:

// elsewhere.js
var db     = require("./database");

db.DbConnection();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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