[英]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
構造函數, this
是undefined
,因此您將獲得更早且更容易理解的錯誤。
嚴格模式有很多這樣的好處; 有關概述,請參閱[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.