在节点js中使用mongoose库。我在一个文件中有模式,并且需要该模式来创建模型。但有时会出现以下错误。但有时候不是。
"MissingSchemaError: Schema hasn't been registered for model \"data\".\nUse mongoose.model(name, schema)".
创建模型时需要模式文件时是否有任何问题?当我在同一页面(apiFunctions.js)中定义架构结构时,那时没有报告错误。但我希望这个架构在一个单独的文件中,这样在插入/撤销时,我可以只包括架构。
module.exports = require("../../db/index.js");
module.exports.schema = require("../../db/schema/registerSchema");
var dbLib =require('./db');
var registerSchema = dbLib.schema.registerSchema; /* Path to my registerschema file. */
var profile = db.model('collection1',registerSchema);
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();
}
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;
}
答案 0 :(得分:2)
您似乎基本上不了解模块系统在node.js中的工作方式。虽然“需要”只需要“评估”一次,但这并不会自动使事情变得全局化。因此这些行是错误的:
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()
只会评估已经“需要”一次的内容,但您仍需要这样做才能在引用它的模块中创建本地范围。