Объекты со ссылками и виртуальные геттеры возвращают неопределенное значение в файле макета мопса, но успешно запрашиваются из базы данных - PullRequest
0 голосов
/ 26 августа 2018

Моя проблема двоякая, но я думаю, что они оба вызваны одной и той же проблемой: моим определением схемы и / или созданием модели.

Я следую этому учебнику по MDN Nodejs и я не могу понять:

  1. Почему мои объекты, на которые есть ссылки, возвращаются неопределенными в моем файле макета, но я подтвердил, что данные правильно вставляются и запрашиваются (насколько я могу судить)).

  2. Мой виртуальный идентификатор не работает.

Определение схемы:

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.

Снимок экрана:

This is the end result

Инструменты:

  • Узел + Экспресс js

  • Мопс

  • Уровень лицензии mLab

Я совершенно новичок вMongoose DB и Pug знают только столько, сколько учили начинающие в учебном пособии и явно указывают на дальнейшее чтение.

Дайте мне знать, если вам нужна дополнительная информация.Спасибо

1 Ответ

0 голосов
/ 26 августа 2018

Похоже, моей проблемой было использование жирных стрелок.Изменение их на обычный синтаксис function() устранило проблему.

Этот ответ подтвердил, что проблема с поддержкой в ​​nodejs.

...