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

时间:2014-09-24 09:48:16

标签: javascript node.js mongodb mongoose

在节点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();
}
中的

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;
}

1 个答案:

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