通过exports和module.exports对外公开的方法都可以访问,但有区别
比如下面这个页面案例:
const mongoHelper = require('../utils/mongoHelper');
const mongoose = require('mongoose');
const settings = require(`../conf/${process.env.NODE_ENV}/settings`);
const articlesSchema = new mongoose.Schema({
title: {
type: String
},
brief: {
type: String
},
author: {
type: String
},
content: {
type: String
}
});
var mongoUtil = mongoHelper.pool(settings.databases.local.name,settings.databases.local.config)
const articlesModel = mongoUtil.model('articles',articlesSchema, 'articles');
/**首先说一下 ,module,module.exports 这俩对象是啥?
* module 就是当前页面对象。
* module.exports 是一个对象, 里面的东西就是对外暴露的对象属性等, 一次暴露多个方法,就要这样写了。
* 而exports 就是model.exports 的一个引用,
* 我们的目的是暴露出想要暴露出的东西, 不管怎么样,只要将要暴露的东西放到mdoel.exports就行。
* 两种方式暴露方法或对象:
* 1,可以一个一个用exports .上方法, 去暴露,(这个过程也是再给model.exports 加东西的过程)
* exports.aa = "bb";
* 2,也可以将要暴露的对象弄到一起搞成对象直接给model.exports对象进行赋值。
* module.exports = {a:function(){}}
*/
/**
* 关于为什么要使用 exports = module.exports = xxx
*
*/
module.exports = {a:function(){}}
// module.exports 原来的对象就被覆盖成了这个方法,此时暴露的只是这个方法了。
exports.aa = "bb";
// 而exports 引用的是model.exports覆盖前的那个对象, 修改它、在它身上添加属性已经没有用了(它已经不代表暴露对象了)
// 所有我们为了让上面一行的这个暴露动作不失效, 所以不能覆盖原model.exports ,
// 我们这样做: exports = module.exports = xxx
exports = module.exports = {a:function(){}}
exports.aa = "bb";
// 这样的话, 原来的暴露对象赋值给原来的暴露对象, 暴露对象不被覆盖, exports对象的指向仍然是有效的暴露的对象, 然后再往这个exports添加对象, 就实现暴露了。
// 但是这样写的话,要注意这个代码=> exports = module.exports = xxx 以上的暴露动作会失效。
console.log(1);
// 如果向下面这么写,将一个新对象直接赋值给exports , 那这个引用对象,就和model中的暴露对象毛关系没有了, 它就没有任何作用了。下面代码再对这个做暴露动作也没有意义了, 它已经不代表暴露对象了。
exports = {a:function(){}}
前辈原话:
在默认情况下,module.exports 是一个Object, exports 是 module.exports 的一个引用。 大多数人都是通过 exports.xx = yy 来输出。
当模块要输出一个非Object时(比如一个Function),可以使用 module.exports = function () {} ,此时 module.exports 被覆盖了,而 exports 还是原来的对像的引用,为了避免在后面的代码中仍然使用 exports.xx = yy 而导致不能正确输出,需要把 exports 变量也重新设置为新的 module.exports 的引用,所以一般习惯写成 exports = module.exports = xxx