我为请求的消息创建了一个数据加载器(每个请求都附加了消息)似乎无法正常工作。这是批处理功能:
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都是字符串类型。