GraphQL 总是返回 null

Posted

技术标签:

【中文标题】GraphQL 总是返回 null【英文标题】:GraphQL always return null 【发布时间】:2020-09-12 18:39:26 【问题描述】:

我创建了一个关于用户创建的解析器和 graphql 文件。 数据类型好像合适,我有异步处理,但是结果总是返回null。我不知道为什么。

解析器 (createAccount.js)
import  prisma, generateToken, changePhoneNumber  from "../../../utils";
import bcrypt from "bcryptjs";

export default 
  Mutation: 
    createAccount: async (_, args) => 
      const 
        username,
        password,
        password2,
        email,
        phoneNum,
        bio,
        avatarUrl,
       = args;

      if (password !== password2) 
        throw new Error("two password aren't same each other");
      

      const encryptPw = await bcrypt.hash(password, 10);
      const newPhoneNumber = await changePhoneNumber(phoneNum, "+82");
      const user = await prisma.user.create(
        data: 
          username,
          email,
          password: encryptPw,
          phoneNum: newPhoneNumber,
          bio,
          avatarUrl,
        ,
      );
      const token = generateToken(user.id);

      return  token, user ;
    ,
  ,
;

GraphQL 文件 (createAccount.graphql)
type Mutation 
  createAccount(
    username: String!
    email: String!
    password: String!
    password2: String!
    phoneNum: String!
    bio: String
    avatarUrl: String
  ): AuthPayload!



type AuthPayload 
  token: String
  user: User


utils.js
import  PrismaClient  from "@prisma/client";
import jwt from "jsonwebtoken";

export const prisma = new PrismaClient();

export const changePhoneNumber = (phoneNum, locationNum) => 
  var leftStr = locationNum;
  var rightStr = phoneNum.slice(1, phoneNum.length);
  var newStr = leftStr + rightStr;
  return newStr;
;

export const generateToken = (id) => jwt.sign( id , process.env.JWT_SECRET);
models.graphql
type User 
  id: ID!
  avatarUrl: String
  username: String!
  email: String!
  password: String!
  phoneNum: String!
  emailSecret: String
  phoneSecret: String
  bio: String
  rooms: [Room]
  createdAt: String
  messages: [Message]
  sender: [User]
  receiver: [User]

我阅读了其他类似问题的答案,但大多数人说我应该适合数据类型或异步处理。 (Why does a GraphQL query return null?) 但是我的代码使用了异步处理的代码,我猜我匹配了数据类型。为什么这段代码总是返回 null? 另外,除了这个 Mutation 之外,所有其他 Query、Mutation 和 Subscriptions 都返回空值

【问题讨论】:

请创建一个stackblitz,以便我们仔细查看 在返回对象之前可能发生了一些错误 请编辑问题以显示createAccount.js 的导入方式以及您如何使用它创建解析器映射。 @YogeshDeveloper 对不起,我尝试了 stackblitz,但我无法带上 github,所以我留下了我的 github repo 地址。 link @sdy 请查看我编辑的答案。问题归结为您在两个模块中导出的内容(函数而不是对象),这导致 mergeResolvers 返回函数而不是对象。 【参考方案1】:

根据错误,GraphQL 似乎根本没有为 createAccount 字段提供解析器。问题在于您如何合并解析器。这是你的代码:

const allTypes = fileLoader(path.join(__dirname, "api/**/*.graphql"));
const allResolvers = fileLoader(path.join(__dirname, "api/**/*.js"));

const schema = makeExecutableSchema(
  typeDefs: mergeTypes(allTypes),
  resolvers: mergeResolvers(allResolvers),
);

这是allResolvers的结果值:

[  Query:  TestQL: [Function: TestQL]  ,
   Mutation:  addCategory: [Function: addCategory]  ,
   Mutation:  deleteCategory: [Function: deleteCategory]  ,
   Mutation:  editCategory: [Function: editCategory]  ,
   Mutation:  newMessage: [Function: newMessage]  ,
   Subscription:  subMessage: [Object]  ,
  [Function: _default],
   Mutation:  createRoom: [Function: createRoom]  ,
  [Function: _default],
   Query:  getRooms: [Function: getRooms]  ,
   Mutation:  createAccount: [Function: createAccount]  ,
   Mutation:  deleteUser: [Function: deleteUser]  ,
   Mutation:  editProfile: [Function: editProfile]  ,
   Query:  findEmail: [Function: findEmail]  ,
   Mutation:  login: [Function: login]  ,
   Mutation:  requestEmailSecret: [Function: requestEmailSecret]  ,
   Mutation:  resetPassword: [Function: resetPassword]  ,
   Query:  searchUser: [Function: searchUser]  ,
   Query:  seeProfile: [Function: seeProfile]   ]

您的两个模块导出一个函数而不是一个对象:

export default () => ...

因此,mergeResolvers 返回的结果最终是一个函数,而不是一个对象。因此,您根本没有向makeExecutableSchema 提供解析器映射。您需要修复这两个模块的默认导出,以便正确合并解析器。

【讨论】:

以上是关于GraphQL 总是返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Graphql 查询总是返回 null

GraphQL 总是返回 null

Nestjs - @nestjs/graphql GraphQLGatewayModule 总是返回错误请求

Nextjs graphql apollo 缓存总是返回 null

flutter_graphql 不起作用,并且在应用程序构建后总是返回 null

使用 graphql-tools、apollo-link-schema 和 react-hooks 在模拟时总是返回 undefined