标签:node-modules javascript node-js express
我想我很难误解如何使用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); (还打印“酒吧”)
有人可以解释我做错了吗?我想不出有任何其他方法可以做到这一点,因为导出助手(?)本身似乎不接受参数.
解决方法:
您正在导出构造函数.你需要构建它,而不是调用它.
更改
var moduleA = require("./moduleA")(io, client);
至
var moduleA = new (require("./moduleA"))(io, client);
或(为清楚起见)
var ModuleA = require("./moduleA");
var a = new ModuleA(io, client);
您所看到的是在sloppy模式下将构造函数作为函数调用时的常见行为:它引用了全局对象.因此,当然从两个位置修改全局对象将相互覆盖,并且返回它将只返回全局对象.您可以自己测试:使用您当前的代码,
moduleA === moduleB === this === global
防止自己像这样再次射击自己的一种方法是使用严格模式而不是马虎模式.为此,请添加该行
"use strict";
在您编写的每个模块的顶部(在任何其他代码之前).在严格模式下,对于没有new的构造函数,这是未定义的,因此您将获得更早且更容易理解的错误.
严格模式有很多这样的好处;有关概述,请参阅[1],[2],[3].
另一种解决方案是完全停止使用构造函数,而是使用工厂函数.这看起来像:
module.exports = function (io, client) {
var result = {};
result.test = "foo";
return result;
};
无论如何,你似乎都试图做这样的事情,因为即使在构造函数中这样做是完全没必要的,你也会返回它.您可以停止使用它并使用您控制下的实际对象,而不是根据您的函数是被调用还是构造而改变其语义的对象.
标签:node-modules,javascript,node-js,express 来源: https://codeday.me/bug/20190725/1537578.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。