Я вивчаю середній стек і коли намагаюся запустити сервер за допомогою
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);
як я бачу, схема повинна бути зареєстрована для моделі "Пошта", але що може спричинити виникнення винятку?
Заздалегідь спасибі.
Редагувати: Ось помилка винятку
/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);
Відповіді:
92 для відповіді № 1Це не проблема з експортом моделі. У мене була та сама проблема.
Справжнє питання полягає в тому, що потрібні заяви для моделей
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();
10 за відповідь № 2
Якщо хтось не міг це виправити з підходом правильної відповіді (як я), спробуйте поглянути на створення схеми. Я написав "ref" як "User", але правильним було "user".
Неправильно:
createdBy: {
type: Schema.Types.ObjectId,
ref: "User"
}
Правильно:
createdBy: {
type: Schema.Types.ObjectId,
ref: "user"
}
7 для відповіді № 3
ЯКЩО ВИ ВИКОРИСТОВУЄТЕ МНОГО ПІДКЛЮЧЕНЬ mongoDB
пам’ятайте, що при використанні .populate () ви ОБОВ’ЯЗКОВО надаєте модель, оскільки мангуст лише “знайде” моделі на тому самому з’єднанні. тобто де:
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 })
Неправильно (видає помилку "схема не була зареєстрована для моделі"):
Customer.findOne({}).populate("created_by");
0 для відповіді № 4
Детально обговорюючи відповідь Рафаеля Гріллі вище,
Правильно:
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");
0 для відповіді № 5
Ви також повинні перевірити, чи немає у вашій базі даних брудних даних. У підсумку я отримав документ, що містить нижню літеру моделі посилання (user
замість User
). Це спричиняє помилку і неймовірно важко відстежити.
Легко виправити за допомогою швидкого запиту mongo:
db.model.updateMany({ approvedByKind: "user" }, { $set: { approvedByKind: "User" } })