module.exports = {Mongoose,models:{...}}是什么意思?

时间:2017-06-09 02:25:59

标签: json node.js mongoose

我正在学习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是否允许没有值的密钥或没有密钥的值? 或者我错了?

2 个答案:

答案 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