GraphQL всегда возвращает null - PullRequest
2 голосов
/ 26 мая 2020

Я создал преобразователь и файл graphql о создании пользователя.
Тип данных кажется подходящим, и у меня асинхронная обработка, но результат всегда возвращает null. Не знаю почему.

  • Resolver (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]
}

Я читаю ответы на другие подобные вопросы, но большинство сказали, что я должен соответствовать типу данных или асинхронной обработке.
( Почему запрос GraphQL возвращает null? )
Но в моем коде использовался код для асинхронной обработки, и я думаю, что соответствовал типу данных. Почему этот код всегда возвращает null? enter image description here
Кроме того, в дополнение к этой мутации, все остальные запросы, мутации и подписки возвращают значения NULL

1 Ответ

2 голосов
/ 26 мая 2020

Судя по ошибке, похоже, что 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. Вам необходимо исправить экспорт по умолчанию для этих двух модулей, чтобы преобразователи были правильно объединены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...