KeystoneJS和Mongoose,关于通过API返回相关文档的建议

时间:2017-09-22 15:36:40

标签: node.js mongodb express mongoose keystonejs

我有两个由KeystoneJS定义的Mongoose模型:

// models / Movie.js

var Movie = new keystone.List('Movie');
Movie.add({
title: {
    type: Types.Text,
    initial: true,
    required: true,
    index: true,
    unique: true
}).relationship({
    path: 'trailers',
    ref: 'Trailer',
    refPath: 'movie'
});

// models / Trailer.js

var Trailer = new keystone.List('Trailer');

Trailer.add('Trailer', {
  title: {
    type: Types.Text,
    required: true,
    initial: true,
  }
}, 'Movie', {
    movie: {
        type: Types.Relationship,
        ref: 'Movie',
        many: false,
    }
})

电影预告片之间存在一对多的关系。

我为电影编写了一个API:

function findByTitle(req, res) {

    var promise = Movie.model.findOne({
        title: {
            $regex: new RegExp('^' + req.query.title + '$', "i")
        }
    })
    .exec();

    promise.then(function (item) {

        item.populateRelated('trailers', function (err, trailers) {
            item.trailers = trailers;
            res.status(200).send(item);
        })
    })
    .catch(function (err) {
        res.status(500).send(err.name);
    })
}

目前我正在利用KeystoneJS的 populateRelated 方法,这可以按预期抓取相关的预告片。但由于Mongoose模式是不可变的,您应该如何在响应中返回相关的预告片?我知道您可以将strict: false作为架构选项传递,但我觉得以这种方式覆盖架构行为是不安全的。

感觉我正在对框架进行一些打击,因此可能以错误的方式解决这个问题。通过API返回相关字段数据的首选方法是什么?

更新

单独的API端点是否是最佳方式,例如:

api/movies/<movie_id>/trailers

1 个答案:

答案 0 :(得分:0)

尝试使用填充,如下所示:

function findByTitle(req, res) {

  Movie.model.findOne({
    title: {
      $regex: new RegExp('^' + req.query.title + '$', "i")
    }
  })
  .populate('trailers')
  .exec()
  .then(function (item) {
    res.status(200).send(item)
  })
  .catch(function (err) {
    res.status(500).send(err.name)
  })

}