loader.load() 函数必须用一个值调用,但得到:undefined

Ale*_*nça 4 node.js graphql

我正在关注这个graphql教程,一切顺利,直到我尝试使用数据加载器。

我的 server.js 是:

const start = async () => {
  const mongo = await connectMongo();

  const buildOptions = async req => {
    const user = await authenticate(req, mongo.Users);
    return {
      context: {
        dataloaders: buildDataloaders(mongo),
        mongo,
        user
      },
      schema
    };
  };
  app.use('/graphql', bodyParser.json(), graphqlExpress(buildOptions));
  app.use(
    '/graphiql',
    graphiqlExpress({
      endpointURL: '/graphql',
      passHeader: `'Authorization': 'bearer token-name@email.com'`
    })
  );
  app.use('/', expressStaticGzip('dist'));
  app.use('/attendance', expressStaticGzip('dist'));
  app.use('/login', expressStaticGzip('dist'));

  spdy.createServer(sslOptions, app).listen(process.env.PORT || 8080, error => {
    if (error) {
      console.error(error);
      return process.exit(1);
    } else {
      console.info(
        `App available at https://localhost:${process.env.PORT || 3000}`
      );
    }
  });
};
Run Code Online (Sandbox Code Playgroud)

我复制和粘贴 dataloaders.js:

const DataLoader = require('dataloader');

async function batchUsers(Users, keys) {
  return await Users.find({ _id: { $in: keys } }).toArray();
}

module.exports = ({ Users }) => ({
  userLoader: new DataLoader(keys => batchUsers(Users, keys), {
    cacheKeyFn: key => key.toString()
  })
});
Run Code Online (Sandbox Code Playgroud)

还有我的 resolvers.js:

export default {
  Query: {
    allLinks: async (root, data, { mongo: { Links } }) =>
      Links.find({}).toArray()
  },
  Mutation: {
    createLink: async (root, data, { mongo: { Links }, user }) => {
      const newLink = Object.assign({ postedById: user && user._id }, data);
      const response = await Links.insert(newLink);
      return Object.assign({ id: response.insertedIds[0] }, newLink);
    },
    createUser: async (root, data, { mongo: { Users } }) => {
      const newUser = {
        name: data.name,
        email: data.authProvider.email.email,
        password: data.authProvider.email.password
      };
      const response = await Users.insert(newUser);
      return Object.assign({ id: response.insertedIds[0] }, newUser);
    },
    signinUser: async (root, data, { mongo: { Users } }) => {
      const user = await Users.findOne({ email: data.email.email });
      if (data.email.password === user.password) {
        return { token: `token-${user.email}`, user };
      }
    }
  },

  Link: {
    id: root => root._id || root.id,
    postedBy: async ({ postedById }, data, { dataloaders: { userLoader } }) => {
      return await userLoader.load(postedById);
    }
  },
  User: {
    id: root => root._id || root.id
  }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试获取我的 allLinks 时,出现错误:

类型错误:必须使用值调用 loader.load() 函数,但得到:未定义。

谁能帮我?

小智 5

所以我能够通过与用户创建链接,从 Mongo 数据库中删除用户,然后查询postedBy链接的属性来重现错误。

我建议删除所有链接并重新创建您的用户(注册 + 登录),创建一个新链接,然后查询该postedBy字段。