如果值是列表/数组,则从快速路由器中检索值

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=57b694c626a4741c2f4bf6‌​ff&quantity=100&quan‌​tity=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 个键/值

以上是关于如果值是列表/数组,则从快速路由器中检索值的主要内容,如果未能解决你的问题,请参考以下文章

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

rib fib arp fdb

如果不在其他数组中,则从数组中删除值,但保持相同的顺序

如果重复 x 次,则从数组中删除值 | JavaScript

如果两个值匹配,则从 php 中的多维关联数组中删除重复项

js正则和数组