Dataloader 没有返回相同长度的数组?

Posted

技术标签:

【中文标题】Dataloader 没有返回相同长度的数组?【英文标题】:Dataloader did not return an array of the same length? 【发布时间】:2018-09-09 02:56:24 【问题描述】:

我正在用 graphql 和 mongodb (mongoose) 构建一个 express JS 应用程序。我正在使用 facebooks Dataloader 来批处理和缓存请求。

除了这个用例之外,它工作得很好。

我有一个充满用户帖子的数据库。每个帖子都包含用户 ID 以供参考。当我打电话返回数据库中的所有帖子时。帖子返回正常,但如果我尝试在每个帖子中获取用户。拥有多个帖子的用户将只返回一个用户,因为第二个用户的密钥已被缓存。所以来自用户“x”的 2 个帖子(键)只会返回 1 个用户对象“x”。

但是,Dataloader 必须返回与其收到的密钥相同数量的承诺。

它有一个选项可以将缓存指定为 false,这样每个键都会发出请求。但这似乎不适用于我的用例。

对不起,如果我没有很好地解释这一点。

这是我的 graphql 请求

query 
  getAllPosts 
    _id // This is returned fine
    user 
      _id
     
   
 

返回错误:DataLoader must be constructed with a function which accepts Array<key> and returns Promise<Array<value>>, but the function did not return a Promise of an Array of the same length as the Array of keys.

【问题讨论】:

你的 DataLoader 是什么样的? 【参考方案1】:

您是否尝试批量发布密钥[1, 2, 3] 并期望获得用户结果[ user1 , user2, user1 ]

或者您是否尝试批量处理用户密钥 [1, 2] 并期望获得发布结果 [ post1, post3] and [ post2 ]

似乎只有在第二种情况下,您才会遇到键长度与结果数组长度不同的情况。

要解决第二个问题,您可以在 sql 中执行以下操作:

const loader = new Dataloader(userIDs => 
  const promises = userIDs.map(id => 
    return db('user_posts')
      .where('user_id', id);
  );

  return Promise.all(promises);
)

loader.load(1)
loader.load(2)

所以你返回 [[ post1, post3], [ post2 ]] 哪个数据加载器可以解包。

如果你这样做了:

const loader = new Dataloader(userIDs => 
  return db('user_posts')
      .where('user_id', [userIDs]);
)

loader.load(1)
loader.load(2)

你会得到[ post1, post3, post2 ],因此会出现错误:the function did not return a Promise of an Array of the same length as the Array of keys

不确定以上内容是否相关/有帮助。如果您可以提供批量加载功能的 sn-p,我可以修改

【讨论】:

这不是违背了使用数据加载器的目的吗??

以上是关于Dataloader 没有返回相同长度的数组?的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch DataLoader 不返回批处理数据

dataloader 的bug

每日一题 | day15( 查找输入整数二进制中1的个数 | 手套)

7.11牛课题

华为OD机试 - 乘积最大值(Python)

C语言中如何定义一个二维数组,数组长度由输入值确定?