[英]Node, Mongoose, Express - REST api GET subdocument with id
以为我会在几天前结帐节点,并决定创建一个简单的API作为平台的介绍。 我正在使用Express和猫鼬的节点。 目前,我的问题围绕着尝试从主文档中的一系列子文档中获取单个子文档的问题。
我的应用程序结构简单。 我有三种模型:地点,地址和人。 每个地方都嵌入了许多地址,每个地址都嵌入了许多人(我选择这样做是为了获得有关子文档和子子文档的练习)。 模型本身被分成自己的文件,如下所示:
./models/place.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var AddressSchema = require('./address')
var PlaceSchema = new Schema({
name: String,
addresses: [AddressSchema.Schema]
});
module.exports = mongoose.model('Place', PlaceSchema);
.models / address.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PersonSchema = require('./person');
var AddressSchema = new Schema({
street: String,
city: String,
state: String,
zip: Number,
people: [PersonSchema.Schema]
});
module.exports = mongoose.model('Address', AddressSchema);
.models / person.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var PersonSchema = new Schema({
name: String,
});
module.exports = mongoose.model('Person', PersonSchema);
如我们所见,一个地点可以包含一个地址数组,每个地址可以包含一个人数组。
现在,就我的实际路线而言,我没有问题添加地点,并向地点添加地址(到目前为止,我还没有深入到人员级别)。 我遇到的问题是试图获得一个地址。 我在想,一旦我收到一个地址,接下来我就可以将一堆人分配给该地址。
这是引起麻烦的路线:
router.route('/places/:place_id/addresses/:address_id')
.get(function(req, res) {
Place.findById(req.params.place_id, function(err, place) {
if (err)
res.send(err);
res.json(place.addresses.id(req.params.address_id));
});
});
从猫鼬文档来看,在这种情况下,.id()方法看起来像是goto,但这样做时却出现“ TypeError”,日志显示该对象没有方法“ id”。
另一方面,获取单个位置的所有地址的问题为零:
router.route('/places/:place_id/addresses')
.get(function(req, res) {
Place.findById(req.params.place_id, function(err, place) {
if (err)
res.send(err);
res.json(place.addresses);
});
})
创建和保存地点,创建和保存地址到地点等也没有问题。
我试图挖掘并找到其他遇到类似问题的人。 我发现其他人也遇到过相同的类型错误,但通常与模型初始化的顺序有关。 多数人似乎是在一个大文件中初始化其模型,而初始化的顺序很重要。 我不明白这里会是什么问题?
希望这只是我做的愚蠢的事情,因为我很沮丧。 很感谢任何形式的帮助。
编辑 - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------
我认为我的问题围绕上述GET请求中的:address_id参数的id值。
从这篇文章中得到一些启发:
MongoDB,Mongoose:如何在找到的文档中找到子文档?
我将get函数更新为以下内容(尽管我不知道为什么最初的内容无法正常工作):
router.route('/places/:place_id/addresses/:address_id')
.get(function(req, res) {
Place.findById(req.params.place_id, function(err, place) {
if (err)
res.send(err);
var address = place.addresses.filter(function (address) {
return address._id === req.params.address_id;
}).pop();
res.json(address);
});
});
如果我使用.city代替._id来过滤我的地址,那么我将在总数组中返回正确的地址。 显然,这不是我想要的。 我想根据其ID返回一个地址。
任何帮助表示赞赏。
在Mongoose中, MongooseArray类型和MongooseDocumentArray类型之间存在区别,后者具有您要查找的id()
方法。
通过将AddressSchema
移到与PlaceSchema
相同的文件中,我可以使您的代码正常工作。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var AddressSchema = Schema({
street: String,
city: String,
state: String,
zip: Number
});
var PlaceSchema = Schema({
name: String,
addresses: [AddressSchema]
});
module.exports = mongoose.model('Place', PlaceSchema);
现在,从回调Place.findById(...)
表示place.addresses
作为DocumentArray
和单独的子文档被列为EmbeddedDocument
。
我还将模式移回了它们各自的文件。 这次,我确保导出模式而不是模型。 这也有效。
进一步检查代码,我发现了问题!
您正在引用Address.Schema
。 这应该是Address.schema
(注意小写)。 由于Address.Schema
undefined
,所以猫鼬可以接受任何东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.