簡體   English   中英

module.exports在node.js應用程序中沖突/被覆蓋

[英]module.exports colliding / being overwritten in node.js application

我想我很難誤解如何使用module.exports。 似乎每個模塊都覆蓋了最后一個模塊吐出的內容。

app.js

var express = require("express")
    , app = express()
    , routes = require('routes')
    , server = app.listen(1337, "0.0.0.0")
    , io = require('socket.io').listen(server)
    , redis = require("redis")
    , client = redis.createClient();

var moduleA = require("./moduleA")(io, client); (需要傳遞socket.io和redis客戶端)

var moduleB = require("./moduleB")(io, client); (相同)

moduleA.js

module.exports = function(io, client){ 
    this.test = 'foo';
    return this;
};

moduleB.js

module.exports = function(io, client){ 
    this.test = 'bar';
    return this;
};

回到app.js

console.log(moduleB.test); 打印“酒吧”

console.log(moduleA.test); 打印“酒吧”

有人可以解釋我做錯了嗎? 我想不出有任何其他方法可以做到這一點,因為exports助手(?)本身似乎不接受參數。

您正在導出構造函數。 你需要構建它,而不是調用它。

更改

var moduleA = require("./moduleA")(io, client);

var moduleA = new (require("./moduleA"))(io, client);

或(為清楚起見)

var ModuleA = require("./moduleA");
var a = new ModuleA(io, client);

您所看到的是在sloppy模式下將構造函數作為函數調用時的常見行為: this引用了全局對象。 所以當然在兩處修改全局對象將覆蓋對方,並返回this將只返回全局對象。 您可以自己測試:使用您當前的代碼,

moduleA === moduleB === this === global

防止自己像這樣再次射擊自己的一種方法是使用嚴格模式而不是馬虎模式。 為此,請添加該行

"use strict";

在您編寫的每個模塊的頂部(在任何其他代碼之前)。 在嚴格模式下,對於沒有new構造函數, thisundefined ,因此您將獲得更早且更容易理解的錯誤。

嚴格模式有很多這樣的好處; 有關概述,請參閱[1][2][3]


另一種解決方案是完全停止使用構造函數,而是使用工廠函數。 這看起來像:

module.exports = function (io, client) {
    var result = {};
    result.test = "foo";
    return result;
};

無論如何,你似乎都試圖做這樣的事情,因為即使在構造函數中這樣做是完全沒必要的,你也會return this 您可以停止使用this並使用您控制下的實際對象,而不是根據您的函數是被調用還是構造而改變其語義的對象。

暫無
暫無

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

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