首页 > 解决方案 > GraphQL 总是返回 null

问题描述

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

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 };
    },
  },
};

type Mutation {
  createAccount(
    username: String!
    email: String!
    password: String!
    password2: String!
    phoneNum: String!
    bio: String
    avatarUrl: String
  ): AuthPayload!
}


type AuthPayload {
  token: String
  user: User
}

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);
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]
}

我阅读了其他类似问题的答案,但大多数人说我应该适合数据类型或异步处理。
为什么 GraphQL 查询返回 null?
但是我的代码使用了异步处理的代码,我猜我匹配了数据类型。为什么这段代码总是返回 null? 此外,除了这个 Mutation,所有其他 Query、Mutation 和 Subscriptions 都返回空值在此处输入图像描述

标签: graphql

解决方案


根据该错误,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. 您需要修复这两个模块的默认导出,以便正确合并解析器。


推荐阅读