/ / Схема мангуста не зареєстрована для моделі - node.js, mongodb, мангуст

Схема Mongoose для моделі не зареєстрована - node.js, mongodb, мангуст

Я вивчаю середній стек і коли намагаюся запустити сервер за допомогою

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" } })