簡體   English   中英

Mongoose Schema 尚未注冊模型

[英]Mongoose Schema hasn't been registered for model

我正在學習平均堆棧,當我嘗試使用啟動服務器時

npm start

我得到一個例外說:

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)

這是我在 /models/Posts.js 中的代碼

var mongoose = require('mongoose');

var PostSchema = new mongoose.Schema({
    title: String,
    link: String, 
    upvotes: { type: Number, default: 0 },
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }]
});

mongoose.model('Post', PostSchema);

正如我所看到的,應該為模型“Post”注冊模式,但是什么可能導致拋出異常?

提前致謝。

編輯:這是異常錯誤

/home/arash/Documents/projects/personal/flapper-news/node_modules/mongoose/lib/index.js:323
  throw new mongoose.Error.MissingSchemaError(name);
        ^
MissingSchemaError: Schema hasn't been registered for model "Post".
Use mongoose.model(name, schema)

這是帶有貓鼬初始化的 app.js 代碼:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

行前:

app.use('/', routes);

這不是模型導出的問題。 我遇到過同樣的問題。

真正的問題是需要模型的語句

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

低於路由依賴項。 只需將 mongoDB 依賴項移到路由依賴項之上。 這應該是這樣的:

// MongoDB
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

如果有人無法用正確答案的方法解決它(比如我),請嘗試查看模式的創建。 我將“參考”寫為“用戶”,但正確的是“用戶”。

錯誤的:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
}

正確的:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'user'
}

如果您使用多個 mongoDB 連接


請注意,當使用 .populate() 時,您必須提供模型,因為 mongoose 只會在同一連接上“找到”模型。 即在哪里:

var db1 = mongoose.createConnection('mongodb://localhost:27017/gh3639');
var db2 = mongoose.createConnection('mongodb://localhost:27017/gh3639_2');
var userSchema = mongoose.Schema({
  "name": String,
  "email": String
});

var customerSchema = mongoose.Schema({
  "name" : { type: String },
  "email" : [ String ],
  "created_by" : { type: mongoose.Schema.Types.ObjectId, ref: 'users' },
});

var User = db1.model('users', userSchema);
var Customer = db2.model('customers', customerSchema);

正確做法:

Customer.findOne({}).populate('created_by', 'name email', User)
Customer.findOne({}).populate({ path: 'created_by', model: User })

// you can pass the model NAME instead of model instance
Customer.findOne({}).populate({ path: 'created_by', model: 'User' }) 

不正確(產生“尚未為模型注冊模式”錯誤):

Customer.findOne({}).populate('created_by');

我使用以下方法來解決問題

const mongoose = require('mongoose');
const Comment = require('./comment');

const PostSchema = new mongoose.Schema({
            title: String,
            link: String, 
            upvotes: { type: Number, default: 0 },
            comments: [{ type: mongoose.Schema.Types.ObjectId, ref: Comment }]
        });
mongoose.model('Post', PostSchema);

請看,這里的ref沒有string類型的值,現在它指的是Comment模式。

這是https://mongoosejs.com/docs/populate.html#cross-db-populate

它說我們必須將模型作為第三個參數傳遞。

例如

 //Require User Model const UserModel = require('./../models/User'); //Require Post Model const PostModel = require('./../models/Post'); const posts = await PostModel.find({}) .select('-__v') .populate({ path: 'user', select: 'name -_id', model: UserModel }); //or const posts = await PostModel.find({}) .select('-__v') .populate('user','name', UserModel);

當您使用的模型依賴於另一個模型,但該模型尚未注冊時,就會出現此問題。

一個簡單的解決方法是將model添加到 popualte 而不是依賴於架構中的ref

=>> 示例

const jobs = await Job.find({}).populate({
    path: "jobDescriptions",
    model: JobDesc,
    select: "list",
    populate: {
      path: "list",
      select:"name list",
      model: Skill,
    },
  });

當我們在 mongoose 模型之間創建錯誤的引用 (ref) 時,也會彈出此錯誤。

就我而言,我指的是文件名而不是模型名。

例如:

const userModel = mongoose.model("user", userSchema);

我們應該引用“用戶”(型號名稱)而不是“用戶”(文件名);

問題在於 refs,始終確保將 refs 引用到您從模型中導出的任何名稱。

// 模型

const Task = mongoose.model('**Tasks**', taskSchema);

//引用

userSchema.virtual('tasks', {
ref: '**Tasks**',
localField: '_id', // field in current model
foreignField: 'owner' // corresponding field in other model

});

.\nodeapp\node_modules\mongoose\lib\index.js:452
      throw new mongoose.Error.MissingSchemaError(name);
      ^
MissingSchemaError: Schema hasn't been registered for model "users".
Use mongoose.model(name, schema)
    at new MissingSchemaError

在 server.js 上使用 setTimeout 時解決了這個錯誤

mongoose.connect(env.get('mongodb.uri'), { useNewUrlParser: true })
  .then(() => logger.info("MongoDB successfully connected"))
  .catch(err => logger.error(err));
app.use(passport.initialize());
setTimeout(function() {
  require("./src/utils/passport")(passport);
}, 3000);

我也面臨同樣的問題。 我的問題的解決方案是查看與我實際導出的模型相比名稱不同的 ref 參數,因此沒有找到這樣的模型。

userSchema.virtual('tasks', {
    ref: 'Task',
    localField: '_id',
    foreignField: 'owner'
})
  

而我實際導出的是:-

const Tasks = mongoose.model('Tasks', taskSchema)

module.exports = Tasks

Task作為Tasks糾正后,我的問題得到了解決

詳細闡述上面 Rafael Grilli 的回答,

正確的:

var HouseSchema = new mongoose.Schema({
  date: {type: Date, default:Date.now},
  floorplan: String,
  name:String,
  house_id:String,
  addressLine1:String,
  addressLine2:String,
  city:String,
  postCode:String,
  _locks:[{type: Schema.Types.ObjectId, ref: 'xxx'}] //ref here refers to the first parameter passed into mongoose.model()
});
var House = mongoose.model('xxx', HouseSchema, 'houseschemas');

您還應該檢查您的數據庫中沒有臟數據。 我最終得到了一個包含引用模型的小寫版本的文檔( user而不是User )。 這會導致錯誤並且非常難以追蹤。

通過快速 mongo 查詢輕松修復:

db.model.updateMany({ approvedByKind: 'user' }, { $set: { approvedByKind: 'User' } })

就我而言,這個問題是因為我沒有將模型或參考模型包含到應用程序中。 所以你應該在你的節點應用程序中需要Post modelComment model

在創建新模型時引用您在模型名稱中引用的相同名稱。

例如:如果我有貓鼬模型,例如:

var Post = mongoose.model("post",postSchema);

然后我必須通過寫ref:"post"來引用帖子集合。

我的問題是使用下面的

adminModel.findById(req.params.id).populate({ path: "users", model: userModel //用戶集合名稱 })

只是想為我補充一點,我在導入導致它失敗的架構時使用了解構。

正確的

var intakeSchema = require('../config/models/intake')

不正確

var { intakeSchema } = require('../config/models/intake')

你沒有給模型任何價值

就我而言,我使用的是在建立 MongoDB 連接時沒有更新的模型。

所以,我有類似的東西

const Device = require('../../models/device')
// make use of Device

有了這個連接

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User])

使固定

啟動連接時必須將模型添加到conn

conn = await mongo.createConnection(conn,
      [JobApplication, Job, User, Device])

請注意,我將Device添加到連接中。

import User from '..'

Customer.findOne({}).populate({ path: 'created_by', model: User })

這個答案對我有用。 但是,您將不得不導入模型而不是將其設置為 cote

我只是面臨同樣的問題。 我為產品創建了評論。 然后我刪除了它們。 每當 mongoose 嘗試填充已刪除項目的數據時, Mongoose Schema hasn't been registered for model錯誤。 刪除評論集合后,錯誤消失了。

我也面臨同樣的問題,但我通過刪除module.exports解決了

module.exports = mongoose.model('user', userSchema); // 移除 module.exports
並使用 like:: mongoose.model('user', userSchema);

const mongoose = require('mongoose');
const ObjectId = require('mongoose').ObjectId;

var userSchema = new mongoose.Schema({
    Password: { type: String },  
    Email: { type: String, required: 'This field is required.', unique:true },  
    songs: [{ type: ObjectId, ref: 'Songs'}]
});

// Custom validation for email
userSchema.path('Email').validate((val) => {
    emailRegex = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return emailRegex.test(val);
}, 'Invalid e-mail.');

// module.exports = mongoose.model('user', userSchema);  // remove 'module.exports ='
mongoose.model('user', userSchema); // resolved issue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM