架构在分离的文件中时创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一个本地作用域。