【问题标题】:How to return custom object from resolver in graphql?如何从graphql中的解析器返回自定义对象?
【发布时间】:2019-10-01 22:45:21
【问题描述】:

我有 nodejs 和 graphql 应用程序。

我的用户架构和解析器使用graphql-compose-mongoose

import { composeWithMongoose } from 'graphql-compose-mongoose';

const UserTC = composeWithMongoose(User, {
  fields: { remove: ['password'] },
});

UserTC.addResolver({
  name: 'currentUser',
  type: UserTC.getType(),
  resolve: currentUserResolver, // return user object...
});

我将解析器添加到我的 UserTC:

UserTC.addResolver({
  name: 'login',
  args: {
    email: { type: 'String!' },
    password: { type: 'String!' },
  },
  type: /// <---- MISSING TYPE HERE
  resolve: async ({ args, context }) => {
    const { email, password } = args;
    const { token, user } = login({ email, password });
    return { token, user }
  },
});

我需要为这个解析器返回 { token, user }。

我应该定义什么类型?

这个我试过但失败了:

type: { token: 'String', user: UserTC.getType() }

【问题讨论】:

    标签: node.js graphql graphql-compose-mongoose graphql-compose


    【解决方案1】:

    我不知道你是否已经解决了这个问题,但是这样你可以定义你将使用什么作为 Args 以及哪些字段可以在解析器中公开

    const { schemaComposer, toInputObjectType } = require('graphql-compose');
    
    const MyCustomAuth = schemaComposer.createObjectTC({
        name: 'Login',
        fields: {
            // Args
            username: 'String!',
            password: 'String!',
            // Fields to return
            email: 'String',
            city: 'String',
            token: 'String'
        }
    });
    
    const MyCustomAuthITC = toInputObjectType(MyCustomAuth);
    

    这是一个使用 JWT

    的示例
    UserTC.addResolver({
        kind: 'mutation',
        name: 'Auth',
        // Your Custom Object
        type: MyCustomAuth,
        args: {
            // Here goes the Input    
            input: MyCustomAuthITC
        },
        resolve: async ({args}) => {
            return new Promise( async (resolve, reject) => {
                const { username, password } = args.input;
                //Get user by username
                const user = await User.findOne({username});
                if (!user) reject('Authentication Failed');
                const token = jwt.sign(user.toJSON(), config.JWT_SECRET, {
                    expiresIn: '1h',
                    subject: user.id
                });            
                resolve({
                    email: user.email,
                    city: user.email,
                    token: token
                });
            });
        }    
    });
    

    现在你需要在login: UserTC.getResolver('Auth')这样的地方调用解析器

    【讨论】:

    • 我认为你可以使用 addArgs 函数,但尽管你使用 addResovler 你需要使用 mongooseresolver 让你的代码更干净
    猜你喜欢
    • 2020-02-21
    • 2020-09-21
    • 2020-10-04
    • 1970-01-01
    • 2021-12-22
    • 2020-06-13
    • 2020-07-21
    • 2020-10-04
    • 1970-01-01
    相关资源
    最近更新 更多