gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:16:38 24 4
gpt4 key购买 nike

我在 Node js 中使用 Mongoose 库。我在文件中有架构,并且需要该架构来创建模型。但有时会出现以下错误。但有时不是。

"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();
}

/db 中的 index.js

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 的属性。 “模式”属性实际上是可以从“模型”中引用的东西,一旦它被定义。所以一种用法可能是这样的:

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() 只会评估已经“需要”一次的内容,但您仍然需要这样做才能在引用它的模块中创建一个本地范围。

关于javascript - 当模式位于单独的文件中时,创建模型时是否存在任何问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26013739/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com