Mongoose Schema尚未注册

ara*_*een 59 mongoose mongodb node.js

我正在学习平均堆栈,当我尝试启动服务器时

npm start
Run Code Online (Sandbox Code Playgroud)

我得到一个例外说:

schema hasn't been registered for model 'Post'. Use mongoose.model(name, schema)
Run Code Online (Sandbox Code Playgroud)

这是我在/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);
Run Code Online (Sandbox Code Playgroud)

正如我所看到的,应该为模型'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)
Run Code Online (Sandbox Code Playgroud)

这是使用mongoose初始化的app.js代码:

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');
Run Code Online (Sandbox Code Playgroud)

在行之前:

app.use('/', routes);
Run Code Online (Sandbox Code Playgroud)

小智 117

这不是模型导出的问题.我遇到过同样的问题.

真正的问题是模型的require语句

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/news');
require('./models/Posts');
require('./models/Comments');
Run Code Online (Sandbox Code Playgroud)

低于路线依赖.只需将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();
Run Code Online (Sandbox Code Playgroud)

  • 它对我不起作用。显示相同的错误 (2认同)

Raf*_*lli 29

如果有人不能用正确答案的方法(像我一样)修复它,那么试着看一下模式的创建.我把'ref'写成'User',但正确的是'user'.

错误:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'User'
}
Run Code Online (Sandbox Code Playgroud)

正确:

createdBy: {
    type: Schema.Types.ObjectId,
    ref: 'user'
}
Run Code Online (Sandbox Code Playgroud)

  • 解决了我的问题:) (2认同)

use*_*725 16

如果您使用多个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);
Run Code Online (Sandbox Code Playgroud)

正确:

Customer.findOne({}).populate('created_by', 'name email', User)
Run Code Online (Sandbox Code Playgroud)

要么

Customer.findOne({}).populate({ path: 'created_by', model: User })
Run Code Online (Sandbox Code Playgroud)

不正确(生成"架构尚未注册模型"错误):

Customer.findOne({}).populate('created_by');
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案解决了我的问题!`findOne({}).populate({ path: 'created_by', model: User })` (3认同)

Nik*_*ats 12

这是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);
Run Code Online (Sandbox Code Playgroud)


scr*_*2em 11

当您使用依赖于另一个模型的模型,但另一个模型尚未注册时,就会出现此问题。

一个简单的修复方法是添加model到 popualte 而不是依赖于ref模式

=>> 示例

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


小智 6

当我们在 mongoose 模型之间创建错误的引用 (ref) 时,也会弹出此错误。

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

例如:

const userModel = mongoose.model("user", userSchema);
Run Code Online (Sandbox Code Playgroud)

我们应该引用“用户”(型号名称)而不是“用户”(文件名);


kul*_*pem 5

我使用以下方法解决了问题

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);
Run Code Online (Sandbox Code Playgroud)

请注意,这里ref没有string类型值,现在它是指Comment架构。


小智 5

问题在于引用,请始终确保将引用引用到您从模型导出的任何名称。

// 模型

const Task = mongoose.model('**Tasks**', taskSchema);
Run Code Online (Sandbox Code Playgroud)

//引用

userSchema.virtual('tasks', {
ref: '**Tasks**',
localField: '_id', // field in current model
foreignField: 'owner' // corresponding field in other model
Run Code Online (Sandbox Code Playgroud)

});