使用populate时,引用的模型未在编辑页面中显示

时间:2017-09-29 08:55:34

标签: node.js mongodb mongoose-schema

在我的应用程序中,我有两个模型 - Book和Genre。我使用const mongoose = require('mongoose') mongoose.Promise = global.Promise const Schema = mongoose.Schema const bookSchema = Schema({ name: { type: String, trim: true, required: 'Please enter a book name' }, description: { type: String, trim: true }, author: { type: String, trim: true, }, category: { type: String, trim: true }, genre: [{ type: Schema.Types.ObjectId, ref: 'Genre' }] }) module.exports = mongoose.model('Book', bookSchema) 从Book模型中引用了Genre模型。这就是我的模型的样子:

预订模型

const mongoose = require('mongoose')
mongoose.Promise = global.Promise
const Schema = mongoose.Schema

const genreSchema = Schema({
  name: {
    type: String,
    trim: true,
    required: 'Please enter a Genre name'
  }
})

module.exports = mongoose.model('Genre', genreSchema)

类型模型

router.get('/edit/:id', (req, res, next) => {
  const book = Book.findOne({ _id: req.params.id })
  .populate({
    path: 'genre',
    model: 'Genre',
    populate: {
      path: 'genre',
      model: 'Book'
    }
  })
  .exec()
    .then((book) => {
      const genres = Genre.find({ 'genre': req.params.id })
      res.render('editBook', { book, genres })
    })
    .catch((err) => {
      throw err
    })
})

router.post('/edit/:id', (req, res, next) => {
  req.checkBody('name', 'Name is required').notEmpty()
  req.checkBody('description', 'Description is required').notEmpty()
  req.checkBody('category', 'Category is required').notEmpty

  const errors = req.validationErrors()

  if (errors) {
    console.log(errors)
    res.render('editBook', { book, errors })
  }

  const book = Book.findOneAndUpdate({ _id: req.params.id }, req.body,
  {
    new: true,
    runValidators:true
  }).exec()
  .then((book) => {
    res.redirect(`/books/edit/${book._id}`)
  })
  .catch((err) => {
    res.send({
      'message': err
    })
  })
})

在图书编辑页面上,我希望能够显示可用的类型,并检查已保存在该特定图书中的类型。

以下是我的路线:

.form-group
          label.col-lg-2.control-label Genre
          .col-lg-10
            for genre in genres
              .checkbox
                input.checkbox(type='checkbox', name='genre', id=genre._id, value=genre._id, checked=genre.checked)
                label(for=genre._id) #{genre.name}

应该显示类型的部分如下所示:

S01_2017925
S01_2017926
S01_20170926_105439
S01_20170926_122707

我可能做错了什么?我已经尝试了所有我知道的解决方案,但没有任何效果。

P.S mongoose-deep-populate插件很长时间没有更新。我使用的解决方案适用于节目路线,可在此处找到 - https://stackoverflow.com/a/43464418/2119604

1 个答案:

答案 0 :(得分:0)

您错误地使用了mongose populate方法。 populate返回父项和引用模型的对象。在你的情况下book有一个类型数组(顺便说一句,它在你的模式中有错误的名称,单个而不是复数),所以你不需要额外的请求来加载类型:

router.get('/edit/:id', (req, res, next) => {
  Book
    .findOne({ _id: req.params.id })
    .populate('genre')
    .exec()
    .then(book => res.render('editBook', { book, genres: book.genre }))
    .catch(err => {
      console.log(err);
      next(err);
    });
});