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)
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)
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)
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)
我们应该引用“用户”(型号名称)而不是“用户”(文件名);
我使用以下方法解决了问题
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)
});