架构在分离的文件中时创build模型时是否有任何问题?
我在节点js内使用mongoose库。 我有一个文件中的模式,并要求该模式来创build模型。 但有时会出现以下错误。 但有时不。
"MissingSchemaError: Schema hasn't been registered for model \"data\".\nUse mongoose.model(name, schema)".
创build模型时需要模式文件时是否有任何问题? 当我在同一页面(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中工作。 虽然“需求”确实只需要“评估” 一次 ,但这并不会自动使事情变得全球化。 所以这些线路是错误的:
var dbLib =require('./db'); var registerSchema = dbLib.schema.registerSchema;
原因是因为你定义的“db”模块本身并不是“实际导出”任何匹配registerSchema
属性。 “模式”属性实际上是一旦可以定义,就可以从“模型”中引用。 所以一种使用forms可能是这样的:
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 );
而且,看到模式中的“模式”定义可以从创build时的范围定义中得到。 所以你总是可以从模型中获取模式,并且在同一个地方声明它们通常是这个概念,除非你需要在多个模型中“共享”这个模式,并且你不想“检查”一个现有的模型来得到一个注册的模式。
所以作为一个“多个文件”的上下文,看起来更像这样:
“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()
只会评估一次已经“需要”的东西,但是你仍然需要在你引用它的模块中创build一个本地作用域。