首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在graphql中从解析器返回自定义对象?

如何在graphql中从解析器返回自定义对象?
EN

Stack Overflow用户
提问于 2019-05-15 04:44:38
回答 1查看 435关注 0票数 3

我有nodejs和graphql应用程序。

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

代码语言:javascript
复制
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:

代码语言:javascript
复制
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 }。

我应该定义什么类型?

我尝试了一下,但失败了:

代码语言:javascript
复制
type: { token: 'String', user: UserTC.getType() }
EN

回答 1

Stack Overflow用户

发布于 2021-02-04 00:12:59

我不知道您是否已经解决了这个问题,但是通过这种方式,您可以定义将用作Args的内容以及可以在解析器中公开的字段

代码语言:javascript
复制
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的示例

代码语言:javascript
复制
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')的位置调用解析器

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56138336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档