最近在写nodejs代码的时候发现一个问题,大家看看下面的代码:
var sysDbMgr = (function () { var _instantiated; function sysDbOpt() { var _dbOpt = new dbOpt(); return{ commonDbOpt: function (sqlData, callback) { if (typeof callback !== 'function') { return; } _dbOpt.querySql(sqlData.sqlText, sqlData.sqlValue, function (isErr, count, rst) { if (isErr) { return callback(isErr); } if (count == 0) { return callback(false, []); } callback(isErr, rst); }) } }; } return{ getInstance: function () { if (_instantiated === undefined) { _instantiated = new sysDbOpt(); } return _instantiated; } }; })(); exports.sysDbMgr = sysDbMgr;
大家觉得这段代码什么问题没,反正我刚开始是没有发现什么不正常的地方的,知道后边运行项目的时候发现死活访问不到sysDbMgr.getInstance()这个方法,经过仔细查看发现是exports.sysDbMgr = sysDbMgr;这种写法的问题,我改成
module.exports = sysDbMgr;之后一切ok了。这就是我要说的exports和module.exports的区别:
(1)exports 是指向的module.exports 的引用;
(2)module.exports 初始值为一个空对象{},所以exports 初始值也是{};
(3)require() 返回的是module.exports 而不是exports。
所以第一种写法其实是给module.exports这个空对象添加了一个属性而已,实际上相当于module.exports.sysDbMgr = sysDbMgr,而我们在其他的文件中一般总是会通过require的方式来引用这个文件,所以结合第三点,可以很清楚的看到访问不到sysDbMgr.getInstance()这个方法的原因。