Učím sa stredný zásobník a keď sa pokúšam server spustiť pomocou
npm start
Dostávam výnimku, ktorá hovorí, že:
schema hasn"t been registered for model "Post". Use mongoose.model(name, schema)
tu je môj kód vo vnútri /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);
ako vidím, schéma by mala byť zaregistrovaná pre model „Príspevok“, ale čo môže spôsobovať vyvolanie výnimky?
Vopred ďakujem.
edit: Tu je chyba výnimky
/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)
a tu je kód app.js s mongoose inicializáciou:
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/news");
require("./models/Posts");
require("./models/Comments");
pred riadkom:
app.use("/", routes);
odpovede:
92 pre odpoveď č. 1Nie je to problém s exportom modelu. Mal som rovnaký problém.
Skutočným problémom je, že pre modely je potrebné vyhlásenie
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/news");
require("./models/Posts");
require("./models/Comments");
boli pod závislosťami trás. Jednoducho presuňte závislosti mongoDB nad závislosti závislostí. Takto by to malo vyzerať:
// 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 pre odpoveď č. 2
Ak to niekto nedokáže opraviť prístupom k správnej odpovedi (ako ja), skúste sa pozrieť na vytvorenie schémy. Napísal som „ref“ ako „User“, ale správne bolo „user“.
zle:
createdBy: {
type: Schema.Types.ObjectId,
ref: "User"
}
správne:
createdBy: {
type: Schema.Types.ObjectId,
ref: "user"
}
7 pre odpoveď č. 3
AK POUŽIJETE VIAC PRIPOJENÍ mongoDB
pozor, pri použití .populate () MUSÍTE poskytnúť model, pretože mongoose „nájde“ modely iba na rovnakom pripojení. tj kde:
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);
správne:
Customer.findOne({}).populate("created_by", "name email", User)
alebo
Customer.findOne({}).populate({ path: "created_by", model: User })
nesprávny (produkuje chybu „schéma nebola zaregistrovaná pre model“):
Customer.findOne({}).populate("created_by");
0 pre odpoveď č. 4
Rozpracované k odpovedi Rafaela Grilliho vyššie,
správne:
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 pre odpoveď č. 5
Mali by ste tiež skontrolovať, či vo svojej databáze nemáte špinavé údaje. Skončil som s dokumentom obsahujúcim verziu referenčného modelu s malými písmenami (user
namiesto User
). Toto spôsobuje chybu a je neuveriteľne ťažké ho vypátrať.
Ľahko opraviteľné pomocou rýchleho mongo dotazu:
db.model.updateMany({ approvedByKind: "user" }, { $set: { approvedByKind: "User" } })