KeystoneJS 和 Mongoose,关于通过 API 返回相关文档的建议
KeystoneJS and Mongoose, advice on returning related documents via API
我有两个由 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 模式是不可变的,您应该如何 return 响应中的相关预告片?我知道您可以将 strict: false
作为架构选项传递,但我认为以这种方式覆盖架构行为是不安全的。
感觉我在与框架作斗争,因此可能以错误的方式解决了这个问题。通过 API returning 相关字段数据的首选方法是什么?
更新:
一个单独的 API 端点是否是最好的方式,例如:
api/movies/<movie_id>/trailers
尝试像这样使用 填充:
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)
})
}
我有两个由 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 模式是不可变的,您应该如何 return 响应中的相关预告片?我知道您可以将 strict: false
作为架构选项传递,但我认为以这种方式覆盖架构行为是不安全的。
感觉我在与框架作斗争,因此可能以错误的方式解决了这个问题。通过 API returning 相关字段数据的首选方法是什么?
更新:
一个单独的 API 端点是否是最好的方式,例如:
api/movies/<movie_id>/trailers
尝试像这样使用 填充:
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)
})
}