Я пытаюсь создать службу аутентификации с помощью 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
}
}
что дало мне: Поле «логин» не должно иметь выбора, так как тип «Строка» не имеет подполей.

Тип поля login в вашем типе Mutation — GraphQLString, то есть скаляр. Поскольку скаляры являются конечными узлами, у них нет набора выбора (т. е. других «дочерних» полей). Из спецификации:
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")
}
models предположительно не определено, поскольку вы ссылаетесь на него в первой строке вашего преобразователя, но трудно сказать наверняка, не видя полный код и полную трассировку стека.
Я использовал модели, потому что в уроке было сказано, что я пытался им следовать. Что это должно означать и как я могу выполнить полную трассировку стека? Извините, я новичок в graphql
Пример, которому вы следуете, предполагает, что вы ввели models в вашем контексте. То, как вы это сделаете, зависит от того, что вы используете на бэкэнде для сервера конечной точки GraphQL. Однако вы можете пропустить этот шаг и просто импортировать свои модели непосредственно в свой модуль. Попробуйте это и посмотрите, работает ли это для вас.
В противном случае я полагаю, что ваше руководство должно охватывать настройку контекста для вашей конечной точки GraphQL.
Созданные мной модели мангустов находятся в отдельной папке, и я импортирую их отдельно.
Мне просто нужно, чтобы мутация входа в систему работала, потому что пока все работает. Если вам нужен какой-либо другой код для решения этой проблемы, я могу опубликовать его.
Так что не беспокойтесь о выдергивании models из контекста — просто импортируйте модель User mongoose напрямую и вызовите User.findOne вместо models.Users.findOne
Я сделал это, и теперь он говорит, что пользователя с этим адресом электронной почты нет, хотя у меня уже есть пользователь.
Я использую службу онлайн-базы данных MongoDb. Я думаю, что это называется Атлас. не знаю связано ли это с чем-то
Это звучит как отдельная проблема, не связанная с вашим первоначальным вопросом. Если бы этот ответ решил вашу первоначальную проблему, я бы пометил его как принятый, и если у вас все еще есть последняя проблема, вы можете опубликовать другой вопрос со всеми соответствующими подробностями.
Нет, потому что мутация входа в систему, когда я запускаю ее, говорит, что пользователь не может быть найден.
Я все еще не могу получить подтверждение того, что пользователь вошел в систему
В остальной части вашего кода распознавателя нет ничего явно неправильного. Если пользователя с этим адресом электронной почты не удается найти, то, скорее всего, он изначально создан неправильно. Однако это невозможно отладить с помощью предоставленного вами кода. И опять же, это не связано с синтаксической ошибкой, которую вы видели, которая была вашей первоначальной проблемой. Не стесняйтесь открывать новый вопрос и предоставлять дополнительную информацию там. Сами вопросы SO должны быть ограничены одним вопросом на пост.
В итоге я исправил код входа, и теперь он работает как задумано. Большое спасибо, что сэкономили мне часы разочарования.
Когда я запускаю это, он возвращает: Невозможно прочитать свойство User of undefined