Node.js: mongoose .populate () не показывает данные - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь показать данные из базы данных. У меня есть 3 схемы, все они объединены в одну. Но объединенные данные не отображаются. Я приложил мою схему 3.

async-wait работает нормально с try-catch, который мне кажется чистым. Я также пытался следовать за мангуста . Оба возвращают один и тот же результат.

Нужно упомянуть: я новичок. Таким образом, у вас нет четкого представления о лучших методах, которым нужно следовать.

Схема книги:

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const BookSchema = new Schema({
    title: {
        type     : String,
        required : [true, 'Book Title is Required'],
        max      : 100,
        min      : 5,
        trim     : true,
        lowercase: true
    },
    author: {
        type    : Schema.Types.ObjectId,
        ref     : 'Author',
        required: [true, 'Author is Required']
    }
    genre: [{
        type: Schema.Types.ObjectId,
        ref : 'Genre'
    }]
}, { collection : 'book', timestamps: true });

BookSchema
.virtual('url')
.get(() => {
    return 'book/' + this._id;
});

module.exports = mongoose.model('Book', BookSchema);

Схема автора:

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const AuthorSchema = new Schema({
    firstName: {
        type     : String,
        required : [true, 'First Name is Required'],
        max      : 100,
        min      : 5,
        trim     : true,
        lowercase: true
    },
    lastName: {
        type     : String,
        required : [true, 'Last Name is Required'],
        max      : 100,
        min      : 5,
        trim     : true,
        lowercase: true
    }
}, { collection : 'author', timestamps: true });

AuthorSchema
.virtual('name')
.get(() => {
    return this.firstName + this.lastName;
});

module.exports = mongoose.model('Author', AuthorSchema);

Схема жанра:

const mongoose = require('mongoose');
const Schema   = mongoose.Schema;

const GenreSchema = new Schema({
    name: {
        type     : String,
        required : [true, 'Genre Name is Required'],
        max      : 100,
        min      : 3,
        trim     : true,
        lowercase: true
    }
}, { collection : 'genre', timestamps: true });

module.exports = mongoose.model('Genre', GenreSchema);

Контроллер книги:

exports.bookList = async(req, res, next) => {
    try {
        const bookList = await Book.find({}).populate('author').exec();

        res.render('./book/index', { title: 'Book List', bookList: bookList});
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
};

index.pug:

ul
    each book in bookList
        li 
            a(href=book.url) #{book.title}
            |  (#{book.author.name})

    else
        li  No book Has Been Listed Yet...!
  1. URL не добавляет идентификатор
  2. Данные об авторах не являютсяпоказывая
  3. Если я использую .populate (), то. он показывает (Нан)
  4. Если я не использую заполнение, он ничего не возвращает

Ожидаемый результат: обезьяны и ангелы (Джон)

Токовый выход: обезьян и ангелов (NaN)

Ответы [ 2 ]

1 голос
/ 25 октября 2019

В моем запросе мне просто нужно было добавить обратный вызов, например:

exports.bookList = async(req, res, next) => {
    try {
        const bookList = await Book.find({}).populate('author').exec((err, bookList) => {
            if (err) return bookInstanceList;

            // console.log(bookList);

            res.render('./book/index', { title: 'Book List', bookList: bookList});
        });

    } catch (error) {
        res.status(500).json({ message: error.message });
    }
};

Основная проблема была с функцией стрелки в схеме. Я использовал функцию стрелки, чтобы получить объект. Но функция стрелки не работает с объектом. Вот ссылка: средний

1 голос
/ 25 октября 2019

Пожалуйста, попробуйте следующий код. Я думаю, это будет работать

exports.bookList = async(req, res, next) => {
    try {
        const bookList = await Book.find({}).populate('author').exec((error, list) => list);

        res.render('./book/index', { title: 'Book List', bookList: bookList});
    } catch (error) {
        res.status(500).json({ message: error.message });
    }
};
...