如果值是列表/数组,则从快速路由器中检索值
Posted
技术标签:
【中文标题】如果值是列表/数组,则从快速路由器中检索值【英文标题】:retrieving value from express router if value is a list/array 【发布时间】:2017-01-02 11:24:04 【问题描述】:嘿,我在正在制作的 API 中获取数据时遇到了一些问题,事情是这样的 在我的模型中,我想存储一系列项目,它是传入产品的列表,所以我正在测试 API,我的路由器上的逻辑出现了一些错误,我正在通过帖子发送项目,都具有相同的键但不同的值,控制台以我需要的方式打印它,但是当我尝试将它们放入数组时,甚至当我尝试获取一个时,它会给我错误。
这是物品的型号:
var itemSchema = = new mongoose.Schema(
name: String,
details: String,
quantity: SchemaTypes.Double,
created_at: type: Date, default: Date.now,
last_updated: type: Date, default: Date.now
) mongoose.model('Item', itemSchema);
这是收入模型:
var itemsIncomeSchema = new Schema(
user: type: schemaTypes.ObjectId, ref: 'User',
sender: String,
created_at: type: Date, default: Date.now(),
items: [Item]
) mongoose.model('ItemIncome', itemsIncomeSchema);
我选择以这种方式制作收入模式,因为我想要一个所有项目的列表,但我想要一个正在输入的项目的注册表,所以我不想使用参考。 (多对多)
无论如何,当我通过 API 测试模型时,问题就在这里,我在帖子中发送这样的值:
sender=sender_name&items=57b694c626a4741c2f4bf6fd&items=57b694c626a4741c2f4bffff ...
在我的路由器的 post 方法中,我完美地获取了数据,它甚至可以在控制台上打印,但我不知道如何将项目设为数组或如何从项目中检索数据,因为我需要查找_id 我正在发送,也不确定我是否正确发送它们,因为我不确定我是只传递 _id 还是传递整个项目。
这是帖子:
.post(function(req, res)
var entry = new itemEntry();
var user = req.user;
//var items= req.body.items; <<tried like this but no success
console.log('items: '+req.body.items)
for (var item in req.body.items)
console.log('item: '+item); //it prints item: 0...23 also tried with a toString
entry.user = user._id;
entry.items= items;
entry.save(function(err, entry)
if(err)
return res.send(500, err);
return res.json(entry);
);
)
【问题讨论】:
您的查询中有items
,但正在使用req.body.products
?。目前尚不清楚您的数据是如何发送的。试试console.log(req.body)
看看你会得到什么。
抱歉打错了,它正在返回这个“ items: [ '57b694c626a4741c2f4bf6fd', '57b694c626a4741c2f4bf6ff' ] ” 这是我发送的 ID
【参考方案1】:
什么是ItemEntry?它应该是ItemIncome
吗?在这种情况下,更改您的架构以引用 Item 模型:
items: [type: schemaTypes.ObjectId, ref: 'Item']
然后在你的代码中:
entry.items = req.body.items;
更新:根据您的评论,我认为您的架构需要一些工作。首先,您将无法创建具有相同 id 的新项目,这是行不通的。但是,如果您的意图是引用现有项目但数量不同,那么您需要调整架构以不将数量字段作为项目的一部分,而是作为 ItemIncome 的一部分:
var itemSchema = = new mongoose.Schema(
name: String,
details: String,
created_at: type: Date, default: Date.now,
last_updated: type: Date, default: Date.now
) mongoose.model('Item', itemSchema);
Here's the income model:
var itemsIncomeSchema = new Schema(
user: type: schemaTypes.ObjectId, ref: 'User',
sender: String,
created_at: type: Date, default: Date.now(),
items: [
quantity: quantity: SchemaTypes.Double,
item: type: schemaTypes.ObjectId, ref: 'Item'
]
) mongoose.model('ItemIncome', itemsIncomeSchema);
您提供的数据如下所示:
items=57b694c626a4741c2f4bf6fd&items=57b694c626a4741c2f4bf6ff&quantity=100&quantity=20" and now i'm recieving this " items: [ '57b694c626a4741c2f4bf6fd', '57b694c626a4741c2f4bf6ff' ], quantity: [ '100', '20' ]
然后:
var items = []
for(var i = req.body.items.length - 1; i >= 0; i --)
items.push( quantity: req.body.quantity[i], item: req.body.items[i] )
entry.items = items
如果可以的话,我建议您将数据作为 json 对象传递。它可能会更加健壮,因为您可以将数量和项目 ID 一起传递,而不是像现在这样传递 2 个单独的数组:
postdata:
items: [
id: '57b694c626a4741c2f4bf6fd',
quantity: 100
, ... ]
Express 会将其作为 req.body 字段中的对象提供。
如果您需要创建新项目,那么您需要首先创建并保存每个项目,获取它们的 ID,然后分配它们。您可以使用 async 库来帮助或使用 Promises。
【讨论】:
是的,itemEntry 是 ItemIncome,好的,但它不会只引用项目架构中的项目吗?与项目架构具有的值?如果我想像新项目一样存储该项目,但在 itemIncome 中具有相同的 ID 和不同的数量,该怎么办?我用裁判做吗?因为我理解的是它会引用 itemSchema 中的项目 感谢您的回复,我将根据您的建议进行测试,我以前想过这样做,但我想我在某个地方看到了可以将项目存储在数组中而不是参考,但是我没有保存项目,因为它给我在数组中添加数据时出错,因为我不确定这是否是正确的方法(按照我上面解释的方式传递项目)但我不知道任何其他方式。 您是否要存储项目或引用实际上取决于您的设置。您通常希望避免重复数据。如果发票的每个项目确实是唯一的,则在发票模型中创建项目,但如果它与其他发票可能共享的内容相关,则参考可能更适合。拥有我在更新中显示的设置将是电子商务设置的典型,其中订单引用具有自定义数量的产品。 好的,我更改了模型,现在我通过 post 方法发送以下内容:“items=57b694c626a4741c2f4bf6fd&items=57b694c626a4741c2f4bf6ff&quantity=100&quantity=20”现在我收到了这个“ items: [ ' 57b694c626a4741c2f4bf6fd', '57b694c626a4741c2f4bf6ff' ], 数量: [ '100', '20' ] "我如何迭代它们?这是我的主要问题 谢谢你,我听从了你的建议,现在我以 json 格式发送帖子,感觉好多了!它正在工作,谢谢!编辑:忘了提到 for 不起作用,因为每当我检查 req.body 的大小时,它给了我类似 28 的东西,我只发送了 2 或 3 个键/值以上是关于如果值是列表/数组,则从快速路由器中检索值的主要内容,如果未能解决你的问题,请参考以下文章
如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回