当模式位于单独的文件中时,创建模型时是否存在任何问题
Is there any issues while creating a model when the schema is in a separated file?
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()
只会对已经"必需"的东西求值一次,但您仍然需要这样做才能在引用它的模块中创建一个本地作用域。
相关文章:
- 使用导航属性创建Kendo UI网格模型的问题
- 如何创建具有默认值的JavaScript对象字段?(AngularJS模型相关)
- sailsjs在创建两个模型时的错误处理
- 如何为动态创建的文本区域中输入的值更新ng模型
- 为各种模型动态创建隐藏的表单字段(MVC 4)
- 在Knockout.js模型中创建项之间的关系
- 在汇编中的yaml前端创建复杂的数据模型
- 通过当前路由器's模型转换为Ember.js中创建的对象
- 使用模型创建实例显示'不是函数'(节点使用猫鼬)
- Knockout JS将我的视图模型创建更改为使用映射pulgin
- 从筛选的模型创建集合
- 角度 - 基于模型创建指令
- 在骨干中为相关模型创建视图和模板
- AngularJS请求模型在另一个模型创建[NodeJS]之前
- 如何使用可观察模型创建数据源
- Backbone.js模型:创建和保存的URL不同
- 在AngularJS中为ng模型创建动态名称
- 如何从视图模型创建Html表
- 如何在sharepoint 2013中使用javascript对象模型创建一个站点列类型作为选择
- BackboneJS使用不同的URL保存模型(创建/更新)