1

我试图弄清楚这一点。

我想从我的数据库中获取我的所有用户,缓存它们,然后在发出新请求时,我想获取我缓存的那些+已创建的新请求。

至今:

const batchUsers = async ({ user }) => {
  const users = await user.findAll({});

  return users;
};

const apolloServer = new ApolloServer({
  schema,
  playground: true,
  context: {
    userLoader: new DataLoader(() => batchUsers(db)),// not sending keys since Im after all users
  },
});

我的解析器:

    users: async (obj, args, context, info) => {
      return context.userLoader.load();
}

load 方法需要一个参数,但在这种情况下,我不想拥有一个特定的用户,我想要所有这些用户。

我不明白如何实现这一点,有人可以解释一下。

4

2 回答 2

1

如果您只是尝试加载所有记录,那么开始使用 DataLoader 并没有多大意义。DataLoader 背后的目的是将多个调用分批成单个调用,然后针对您的数据源执行该调用load(7)load(22)如果您需要获取所有用户,那么您应该直接调用user.findAll

此外,如果您最终使用 DataLoader,请确保传入一个函数,而不是作为上下文的对象。该函数将在每个请求上运行,这将确保您使用的是新的 DataLoader 实例,而不是具有陈旧缓存的实例。

context: () => ({
  userLoader: new DataLoader(async (ids) => {
    const users = await User.findAll({
      where: { id: ids }
    })

    // Note that we need to map over the original ids instead of
    // just returning the results of User.findAll because the
    // length of the returned array needs to match the length of the ids
    return ids.map(id => users.find(user => user.id === id) || null)
  }),
}),

请注意,如果您想拒绝,您也可以返回一个错误实例,而不是null在数组内部。load

于 2020-04-16T19:00:56.670 回答
1

花了我一段时间,但我得到了这个工作:

const batchUsers = async (keys, { user }) => {
  const users = await user.findAll({
    raw: true,
    where: {
      Id: {
        // @ts-ignore
        // eslint-disable-next-line no-undef
        [op.in]: keys,
      },
    },
  });

  const gs = _.groupBy(users, 'Id');
  return keys.map(k => gs[k] || []);
};

const apolloServer = new ApolloServer({
  schema,
  playground: true,
  context: () => ({
    userLoader: new DataLoader(keys => batchUsers(keys, db)),
  }),
});

解析器:

  user: {
    myUsers: ({ Id }, args, { userLoader }) => {
      return userLoader.load(Id);
    },
  },

操场:

{users
{Id
myUsers
{Id}}
}

游乐场解释:

users 基本上会获取所有用户,然后 myusers 通过从第一次调用中继承 id 来做同样的事情。

我想我在这里选择了一个可怕的例子,因为我没有看到任何性能提升。但是,我确实看到查询变成了:

SELECT ... FROM User WhERE ID IN(...)
于 2020-04-16T22:54:19.183 回答