Dataloader不进行批处理和缓存

时间:2018-06-15 04:19:00

标签: node.js graphql apollo

我为请求的消息创建了一个数据加载器(每个请求都附加了消息)似乎无法正常工作。这是批处理功能:

const getMessagesLoader = async ({ userId, keys }) => {
  const selector = {
    'request._id': { $in: keys },
    'recepients._id': userId,
  };

  const messagesByRequestId = {};
  const key = 'request._id';

  Messages.find(selector).forEach(message => {
    console.log(message._id);
    const requestId = _.get(message, key);
    messagesByRequestId[requestId] instanceof Array
      ? messagesByRequestId[requestId].push(message)
      : (messagesByRequestId[requestId] = [message]);
  });

  return keys.map(key => messagesByRequestId[key]);
};

export default userId => new DataLoader(keys => getMessagesLoader({ userId, keys }));

loaders/index.js我创建了一个函数:

import messages from './messages-loader';

export default userId => {
  return {
    messagesLoader: messages(userId),
  };
};

并将其传递给上下文:

import createLoaders from '../loaders';
...
createApolloServer(
  request => {
    return {
      schema,
      context: {
        userId: request.user && request.user._id,
        user: request.user,
        token: request.headers['meteor-login-token'],
        loaders: createLoaders(request.user && request.user._id),

然后在解析请求类型

上的字段messages时调用.load
  messages: ({ _id }, args, context) => {
    const { loaders } = context;

    return loaders.messagesLoader.load(_id);
    }
    ...

每次执行Requests查询时,我在控制台中都会收到消息ID,因为我在批处理函数中有console.log(message._id);这意味着从数据库中获取记录。

最初我认为这是因为我使用Mongo而没有提供cacheKeyFn将id从对象转换为字符串,但因为我正在使用Meteor所有ID都是字符串类型。

0 个答案:

没有答案