当模式位于单独的文件中时,创建模型时是否存在任何问题

Is there any issues while creating a model when the schema is in a separated file?

本文关键字:模型 创建 是否 存在 问题 任何 于单独 文件 模式      更新时间:2023-09-26

Am在节点js中使用mongose库。我在一个文件中有模式,并且需要该模式来创建模型。但有时我会出现以下错误。但有时不会。

"MissingSchemaError: Schema hasn't been registered for model '"data'".'nUse mongoose.model(name, schema)".

创建模型时需要架构文件,这有什么问题吗?当我在同一个页面(apiFunctions.js)中定义模式结构时,没有报告任何错误。但我希望这个模式在一个单独的文件中,这样在插入/检索时,我就可以包含这个模式。

db.js

module.exports = require("../../db/index.js");
module.exports.schema = require("../../db/schema/registerSchema");

apiFunctions.js

var dbLib =require('./db');
var registerSchema = dbLib.schema.registerSchema; /* Path to my registerschema file. */
var profile = db.model('collection1',registerSchema);

regiserSchema.js

var mongoose = require('mongoose');
exports.registerSchema =  new mongoose.Schema( {  
    _website:{ required: true, type: String,trim: true,set: toLower ,index: {unique: true, dropDups: true }},
    user_Id:{ required: true, type: String },
    profile_id :{ required: true, type: String,index: {unique: true, dropDups: true }},
    _time: {type: Date,default: Date.now}
});
function toLower (v) {
  return v.toLowerCase();
}

index.js在/db中

var mongoose = require('mongoose');
module.exports.mongoose = mongoose;
module.exports.getDb = function(dbName)
{
var dburl='mongodb://localhost/'+dbName;
    db = mongoose.createConnection( dburl, {
     server: {
     socketOptions: { keepAlive: 1, connectTimeoutMS: 30000 }, 
     auto_reconnect:false,
     poolSize:1
     }
     },function(err){     
    console.log(err)
});
db.on('error',function(err){
console.log(err + " this is error");
db.close();
});
return db;
}

您似乎基本上不了解模块系统在node.js中是如何工作的。虽然"require"确实只需要"评估"一次,但这不会自动使事情全局化。因此,这些行是错误的:

var dbLib =require('./db');
var registerSchema = dbLib.schema.registerSchema;

原因是您定义的"db"模块实际上并没有导出任何与registerSchema匹配的属性。"schema"属性实际上是可以在定义后从"模型"中引用的东西。因此,一种使用形式可能是:

var mongoose = require("mongoose"),
    Schema = mongoose.Schema;
var collectionSchema = new Schema({
    "_website":{ 
        "required": true,
        "type": String,
        "trim": true,
        "set": toLower ,
        "index": { "unique": true, "dropDups": true }
    },
    "user_Id": { "required": true, "type": String },
    "profile_id":{ 
        "required": true, 
        "type": String,
        "index": { "unique": true, "dropDups": true }
    },
    "_time": { "type": Date, default: Date.now }
});
function toLower (v) {
    return v.toLowerCase();
}
var Collection = mongoose.model( "Collection", collectionSchema );
console.log( Collection.schema );

瞧,"模式"定义可以从创建时具有该定义的模型中获得。因此,您总是可以从模型中获取模式,在同一个地方声明它们通常是一个概念,除非您需要在服务器模型之间"共享"该模式,并且您不想"检查"现有模型以获得注册的模式。

因此,作为"多个文件"上下文,这看起来更像这样:

"collectionSchema.js"

var mongoose = require("mongoose"),
    Schema = mongoose.Schema;
var collectionSchema = new Schema({
    "_website":{ 
        "required": true,
        "type": String,
        "trim": true,
        "set": toLower ,
        "index": { "unique": true, "dropDups": true }
    },
    "user_Id": { "required": true, "type": String },
    "profile_id":{ 
        "required": true, 
        "type": String,
        "index": { "unique": true, "dropDups": true }
    },
    "_time": { "type": Date, default: Date.now }
});
function toLower (v) {
    return v.toLowerCase();
}
module.exports = collectionSchema;

"collectionModel.js"

var mongoose = require("mongoose"),
    collectionSchema = require("./collectionSchema");
module.exports = mongoose.model( "Collection", collectionSchema );

基本上,只要你想使用它导出的对象,就"需要"collectionSchema"模块。

这就是它的工作原理。仅仅因为您将某个东西声明为"导出"一次并不意味着它在您希望的任何其他地方都显示为"全局"。require()只会对已经"必需"的东西求值一次,但您仍然需要这样做才能在引用它的模块中创建一个本地作用域。