gpt4 book ai didi

javascript - module.exports 在 node.js 应用程序中冲突/被覆盖

转载 作者:搜寻专家 更新时间:2023-10-31 23:32:02 27 4
gpt4 key购买 nike

我想我严重误解了如何使用 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 client)

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);(打印“bar”)

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

有人可以解释我做错了什么吗?我想不出任何其他方法来做到这一点,因为 exports 助手 (?) 本身似乎不接受参数。

最佳答案

您正在导出构造函数。您需要构建它,而不是调用它。

改变

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

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

或(为清楚起见)

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

您所看到的是在草率模式下将构造函数作为函数调用时的常见行为: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 并使用您控制下的实际对象,而不是语义根据您的函数是被调用还是构造而改变的对象。

关于javascript - module.exports 在 node.js 应用程序中冲突/被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190262/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com