一尘不染

猫鼬模式创建

node.js

我刚开始是猫鼬。我有一个带猫鼬的创建脚本,该脚本用示例数据创建模式和数据库。

现在,我编写实际的应用程序。每次我的应用程序运行时,我是否需要创建模式对象,或者它已经以某种方式可用?

换句话说,我是否需要在每个使用猫鼬访问数据库的应用程序中运行此代码,还是仅在第一次运行此代码:

var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});

如果我有设置器/验证器/等,答案将如何变化?


阅读 250

收藏
2020-07-07

共1个答案

一尘不染

一个定义就是Schema让应用程序理解如何将数据从MongoDB映射到JavaScript对象。Schema是应用程序的一部分。它与数据库
无关 。它仅将数据库映射到JavaScript对象。所以是的-如果您想获得漂亮的映射,则需要在 每个
需要它的应用程序中运行此代码。它也适用于getters / setters / validations / etc。

但是请注意,这样做:

var mongoose = require('mongoose');
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post
var Comments = new Schema({
    title     : String
  , body      : String
  , date      : Date
});
mongoose.model("Comments", Comments);

将在全球注册Schema。这意味着,如果您正在运行的应用程序正在使用某个外部模块,那么在此模块中,您可以简单地使用

var mongoose = require('mongoose');
var Comments = mongoose.model("Comments");
Comments.find(function(err, comments) {
    // some code here
});

(请注意,您实际上需要Schema在使用此代码之前注册,否则将引发异常)。

但是,所有这些操作仅在一个节点会话内有效,因此,如果您正在运行另一个需要访问的节点应用程序Schema,则需要调用注册代码。因此,最好在单独的文件中定义所有模式,例如,comments.js可能看起来像这样

var mongoose = require('mongoose');
var Schema = mongoose.Schema; // <-- EDIT: missing in the original post

module.exports = function() {
    var Comments = new Schema({
        title     : String
      , body      : String
      , date      : Date
    });
    mongoose.model("Comments", Comments);
};

然后创建models.js看起来像这样的文件

var models = ['comments.js', 'someothermodel.js', ...];

exports.initialize = function() {
    var l = models.length;
    for (var i = 0; i < l; i++) {
        require(models[i])();
    }
};

现在调用require('models.js').initialize();将初始化给定节点会话的所有模式。

2020-07-07