我正在学习Node / Mongo,现在我可以理解这样的代码,
module.exports = mongoose.model('User', UserSchema);
我无法理解以下内容,
module.exports = { Mongoose, // var Mongoose = require('mongoose');
models: {
user: require('./schemas/user.js'),
room: require('./schemas/room.js')
}
};
我可以看到作者想要导出Mongoose和模型。但导出的对象是JSON对象吗? Mongoose 中的键是键还是值? JSON是否允许没有值的密钥或没有密钥的值? 或者我错了?
答案 0 :(得分:1)
看起来那个作者正在使用ES6语义。
在ES6中,您可以简写以下内容:
const Mongoose = require('mongoose');
const myObj = { Mongoose: Mongoose };
为:
const Mongoose = require('mongoose');
const myObj = { Mongoose };
基本上,它会将其解释为与上述相同的语句,前提是该键与命名变量的名称相同。
顺便说一句,在你拥有的例子或我拥有的例子中,不需要输出猫鼬对象; require cache在任何情况下每次都会返回相同的实例。
答案 1 :(得分:1)
首先,只是对术语的澄清: JSON 是一个字符串而不是一个对象因此它的缩写为 J ava S cript O bject N otation。你所拥有的通俗地称为 POJO 或 P lain O ld J avascript O < /强> bject。他们是不同的。
其次,让我们分解出口声明:
{ Mongoose, //...
这是object initialization using shorthand property names的ES6(ES2015)语法。基本上,如果变量名称(var foo = 'hi'
)与对象属性名称匹配,则初始化可以只是{ foo }
,与{ foo: foo }
相同。
关于导出的内容,它将是POJO,相当于:
{
Mongoose: require('mongoose'),
models: {
user: require('./schemas/user.js'),
room: require('./schemas/room.js')
}
};
BONUS:由于Node维护了所需模块的缓存,因此Mongoose将其用作所有声明的模型和模式的缓存机制。如果在一个文件中导入Mongoose并创建模型,则另一个模块将能够导入Mongoose并通过Mongoose的缓存访问该模型。
// a.js
const mongoose = require('mongoose');
const FooModel = new mongoose.model('Foo', {});
// b.js
const aMod = require('./a.js'); // Import here only to declare model.
const mongoose = require('mongoose');
const FooModel = mongoose.model('Foo'); // Same model a.js