graphql - 返回突变结果

标签 graphql graphql-js

我直接的问题是为什么查询解析函数没有被调用?

我怀疑突变解析函数(有效)的返回值存在问题。那么,返回值应该是什么样的?

一个更高层次的问题是:GraphQL 中是否有标准方法来注册新用户并处理已存在用户的情况?

下面的方法是在 session 数据中获取有关用户的所有数据,并仅传回前端需要的数据。

/**
 * graphQL.js
 *
 * Created by jrootham on 18/04/16.
 *
 * Copyright © 2016 Jim Rootham
 */

import graphqlHTTP from "express-graphql";
import {
    graphql,
    GraphQLSchema,
    GraphQLObjectType,
    GraphQLString,
    GraphQLNonNull,
    GraphQLBoolean
} from 'graphql';
import {hash} from "bcrypt"
import {connect, User} from "../database/defineDB";

const GraphUser = new GraphQLObjectType({
    name: "GraphUser",
    description: "A user object",
    fields: () => {
        return {
            name: {
                type: GraphQLString,
                resolve: (_, __, session) => {
                    console.log("resolve name", session);
                    let name = "";
                    if (session.signedOn) {
                        return User.findById(session.userId).then (user => {
                            return user.name;
                        });
                    }

                    console.log("name", name);
                    return name;
                }
            },
            signedOn: {
                type: GraphQLBoolean,
                resolve: (_, __, session) => {
                    return session.signedOn;
                }
            },
            existed: {
                type: GraphQLBoolean,
                resolve: (_, __, session) => {
                    return session.existed;
                }
            }
        }
    }
});

const query = new GraphQLObjectType({
    name: 'Queries',
    fields: () => {
        return {
            graphUser: {
                type: GraphUser
            }
        }
    }
});

const mutation = new GraphQLObjectType({
    name: 'Mutations',
    description: "Modification actions",
    fields() {
        return {
            registerUser: {
                type: GraphUser,
                args: {
                    name: {
                        type: new GraphQLNonNull(GraphQLString)
                    },
                    password: {
                        type: new GraphQLNonNull(GraphQLString)
                    }
                },
                resolve(_, args, session) {
                    console.log("resolve", args);
                    User.findOne({where:{name:args.name}}).then(user => {
                        console.log("After find", user);
                        if (user === null) {
                            const getHash = new Promise(
                                resolve => {
                                    hash(args.password, 10, (err, hash) => {
                                        resolve(hash);
                                    });
                                }
                            );

                            const result = getHash.then(hash => {
                                connect.models.user.create({
                                    name: args.name,
                                    password: hash
                                }).then(user => {
                                    session.userId = user.id;
                                    session.signedOn = true;
                                    session.existed = false;

                                    console.log("session user", session.userId);
                                    return user;
                                });

                                console.log(result);
                                return result;
                            });
                        }
                        else {
                            session.userId = 0;
                            session.signedOn = false;
                            session.existed = true;
                            console.log("existed");
                            return GraphUser;
                        }
                    });
                }
            }
        }
    }
});

const schema = new GraphQLSchema({
    query: query,
    mutation: mutation
});

export const useGraphQL = app => {
    app.use('/graphql', graphqlHTTP(request =>({
        schema: schema,
        context: request.session,
        formatError: error => ({
            message: error.message,
            locations: error.locations,
            stack: error.stack
        }),
        graphiql:true
    })));
};

最佳答案

为什么查询解析函数没有被调用?

您的根查询字段graphUser未得到解析。

const query = new GraphQLObjectType({
    name: 'Queries',
    fields: () => {
        return {
            graphUser: {
                type: GraphUser
                // TODO Add a resolve function here
            }
        }
    }
});

我怀疑突变解析函数(有效)的返回值存在问题。那么,返回值应该是什么样的?

如果您使用 Promise,您的突变的 resolve 函数应该返回一个 Promise(现在不返回),并且应该使用 resolve(result) 而不是返回结果。如果用户已经存在,则只需返回现有的用户对象而不是类型GraphUser

更高层次的问题是:GraphQL 中是否有标准方法来注册新用户并处理已存在用户的情况?

GraphQL 本身没有处理用户注册的标准方法。您只需要进行用户注册的突变。在突变的解析函数中,检查用户是否已经存在。如果存在,则突变可能会返回错误。否则,用户被注册并返回新创建的用户对象。

关于graphql - 返回突变结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106285/

相关文章:

typescript - "$userId"类型的变量 "ID"用于期望类型 "ID!"的位置

图形QLError : There can be only one fragment named

orm - GraphQL, Dataloader, [ORM 与否], 有很多关系理解

javascript - 在 graphql 的解析器中获取用户代理访问权限

typescript - 不能表示非枚举值

asp.net-core - 没有可用的架构 graphql asp net core

graphql - GraphQL 中的查看器字段是什么意思?

javascript - 如何为 GraphQL 服务器设计以下解析器?

javascript - 我应该在 GraphQL Scalar 中抛出一般错误吗?

javascript - Mongoose 虚拟填充返回 null