Моя проблема двоякая, но я думаю, что они оба вызваны одной и той же проблемой: моим определением схемы и / или созданием модели.
Я следую этому учебнику по MDN Nodejs и я не могу понять:
Почему мои объекты, на которые есть ссылки, возвращаются неопределенными в моем файле макета, но я подтвердил, что данные правильно вставляются и запрашиваются (насколько я могу судить)).
Мой виртуальный идентификатор не работает.
Определение схемы:
book.js italize
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const BookSchema = new Schema({
title: {type: String, required: true},
author: {type: Schema.Types.ObjectId, ref: 'Author', required: true},
summary: {type: String, required: true},
isbn: {type:String, required: true},
genre: [{type: Schema.Types.ObjectId, ref: 'Genre'}]
});
//this doesnt seem to be working. returns undefined on the
//object in layout file
BookSchema
.virtual('url')
.get(() => {
return '/catalog/book/' + this._id;
});
module.exports = mongoose.model('Book', BookSchema);
author.js italize
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const AuthorSchema = new Schema({
first_name: {type: String, required: true, max: 100},
family_name: {type: String, required: true, max: 100},
date_of_birth: {type: Date},
date_of_death: {type: Date}
});
//Virtuals
AuthorSchema.virtual('name')
.get(() => {
return this.family_name + ', ' + this.first_name;
});
//create virtual absolute url to obtain instance of this model
AuthorSchema.virtual('url')
.get(() => {
return '/catalog/author/' + this._id;
});
module.exports = mongoose.model('Author', AuthorSchema);
Создание модели:
function authorCreate(first_name, family_name, d_birth, d_death, cb) {
authordetail = {first_name:first_name , family_name: family_name }
if (d_birth != false) authordetail.date_of_birth = d_birth
if (d_death != false) authordetail.date_of_death = d_death
var author = new Author(authordetail);
author.save(function (err) {
if (err) {
cb(err, null)
return
}
console.log('New Author: ' + author);
authors.push(author._id)
cb(null, author)
} );
}
function bookCreate(title, summary, isbn, author, genre, cb) {
bookdetail = {
title: title,
summary: summary,
author: author,
isbn: isbn
}
if (genre != false) bookdetail.genre = genre
var book = new Book(bookdetail);
book.save(function (err) {
if (err) {
cb(err, null)
return
}
console.log('New Book: ' + book);
books.push(book._id)
cb(null, book)
} );
}
controller.js:
// Display list of all books.
exports.book_list = function(req, res) {
Book.find({})
.populate('author')//this seems to work
.exec(function (err, list_books) {
if (err) { return next(err); }
//Successful, so render
for(var b in list_books){
console.log('author id: ' + list_books[b].author._id);//as evidenced here
}
//but the author object is undefined when rendered
res.render('book_list', { title: 'Book List', book_list: list_books });
});
};
layout.pug :
extends layout
block content
h1= title
//url and author undefined here
ul
each book in book_list
li
a(href=book.url) #{book.title}
| #{book.author.name}
else
li There are no books.
Снимок экрана:
Инструменты:
Узел + Экспресс js
Мопс
Уровень лицензии mLab
Я совершенно новичок вMongoose DB и Pug знают только столько, сколько учили начинающие в учебном пособии и явно указывают на дальнейшее чтение.
Дайте мне знать, если вам нужна дополнительная информация.Спасибо