Мутация входа в систему для Graphql не находит пользователя

Я пытаюсь создать службу аутентификации с помощью graphql и mongodb. Я создал свою мутацию входа в систему, которая принимает адрес электронной почты и пароль. Я использую bcrypt для хэширования и расшифровки паролей.

Это не проблема импорта или проблема mongodb, это graphql.

const UserType = new GraphQLObjectType({
    name: 'User',
    fields: () => ({
        id: {type: GraphQLID},
        username: {type: GraphQLString},
        email: {type: GraphQLString},
        password: {type: GraphQLString},
        institution: {
            type: InstitutionType,
            resolve(parent, args){
                return Institution.findById(parent.institutionId)
            }
        }
    })
});
login:{
                type:GraphQLString,
                args:{
                    email: {type: GraphQLString},
                    password: {type: GraphQLString}
                },
                resolve: async (parent, { email, password }, { models, SECRET }) => {
                    const user = await models.User.findOne({ where: { email } });
                    if (!user) {
                      throw new Error('No user with that email');
                    }

                    const valid = await bcrypt.compare(password, user.password);
                    if (!valid) {
                      throw new Error('Incorrect password');
                    }

                    const token = jwt.sign(
                      {
                        user: _.pick(user, ['id', 'username']),
                      },
                      SECRET,
                      {
                        expiresIn: '1y',
                      },
                    );

                    return token;
                  },
                },
              }});

Он должен вернуть токен jwt, который впоследствии можно будет использовать для аутентификации. Сначала я запускал это в graphiql в своем браузере:

mutation{
  login(email: "[email protected]", password:"password"){
  }
}

и это дало мне это в консоли: «Синтаксическая ошибка: ожидаемое имя, найдено

Затем я попробовал:

mutation{
  login(email: "[email protected]", password:"password"){
    username
  }
}

что дало мне: Поле «логин» не должно иметь выбора, так как тип «Строка» не имеет подполей.

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
1
0
1 503
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Тип поля login в вашем типе MutationGraphQLString, то есть скаляр. Поскольку скаляры являются конечными узлами, у них нет набора выбора (т. е. других «дочерних» полей). Из спецификации:

If selectionType is a scalar or enum:

  • The subselection set of that selection must be empty

If selectionType is an interface, union, or object

  • The subselection set of that selection must NOT BE empty

Фигурные скобки используются для обозначения набора выбора, поэтому их не следует использовать, когда тип возвращаемого значения для поля является скалярным или перечислимым. Ваш запрос должен быть простым:

mutation {
  login(email: "[email protected]", password:"password")
}

Когда я запускаю это, он возвращает: Невозможно прочитать свойство User of undefined

Ammar Thayani 17.02.2019 22:28
models предположительно не определено, поскольку вы ссылаетесь на него в первой строке вашего преобразователя, но трудно сказать наверняка, не видя полный код и полную трассировку стека.
Daniel Rearden 17.02.2019 23:13

Я использовал модели, потому что в уроке было сказано, что я пытался им следовать. Что это должно означать и как я могу выполнить полную трассировку стека? Извините, я новичок в graphql

Ammar Thayani 17.02.2019 23:16

Пример, которому вы следуете, предполагает, что вы ввели models в вашем контексте. То, как вы это сделаете, зависит от того, что вы используете на бэкэнде для сервера конечной точки GraphQL. Однако вы можете пропустить этот шаг и просто импортировать свои модели непосредственно в свой модуль. Попробуйте это и посмотрите, работает ли это для вас.

Daniel Rearden 17.02.2019 23:22

В противном случае я полагаю, что ваше руководство должно охватывать настройку контекста для вашей конечной точки GraphQL.

Daniel Rearden 17.02.2019 23:23

Созданные мной модели мангустов находятся в отдельной папке, и я импортирую их отдельно.

Ammar Thayani 17.02.2019 23:28

Мне просто нужно, чтобы мутация входа в систему работала, потому что пока все работает. Если вам нужен какой-либо другой код для решения этой проблемы, я могу опубликовать его.

Ammar Thayani 17.02.2019 23:29

Так что не беспокойтесь о выдергивании models из контекста — просто импортируйте модель User mongoose напрямую и вызовите User.findOne вместо models.Users.findOne

Daniel Rearden 17.02.2019 23:31

Я сделал это, и теперь он говорит, что пользователя с этим адресом электронной почты нет, хотя у меня уже есть пользователь.

Ammar Thayani 17.02.2019 23:39

Я использую службу онлайн-базы данных MongoDb. Я думаю, что это называется Атлас. не знаю связано ли это с чем-то

Ammar Thayani 18.02.2019 00:42

Это звучит как отдельная проблема, не связанная с вашим первоначальным вопросом. Если бы этот ответ решил вашу первоначальную проблему, я бы пометил его как принятый, и если у вас все еще есть последняя проблема, вы можете опубликовать другой вопрос со всеми соответствующими подробностями.

Daniel Rearden 18.02.2019 02:50

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

Ammar Thayani 18.02.2019 03:02

Я все еще не могу получить подтверждение того, что пользователь вошел в систему

Ammar Thayani 18.02.2019 03:03

В остальной части вашего кода распознавателя нет ничего явно неправильного. Если пользователя с этим адресом электронной почты не удается найти, то, скорее всего, он изначально создан неправильно. Однако это невозможно отладить с помощью предоставленного вами кода. И опять же, это не связано с синтаксической ошибкой, которую вы видели, которая была вашей первоначальной проблемой. Не стесняйтесь открывать новый вопрос и предоставлять дополнительную информацию там. Сами вопросы SO должны быть ограничены одним вопросом на пост.

Daniel Rearden 18.02.2019 03:14

В итоге я исправил код входа, и теперь он работает как задумано. Большое спасибо, что сэкономили мне часы разочарования.

Ammar Thayani 18.02.2019 04:06

Другие вопросы по теме