Используемые технологии:
Я пытаюсь заставить graphQL работать на моем сервере узлов. Где у меня конкретно возникают проблемы, так это с решателем graphql.
У меня есть следующий код, который отлично работает.
let User = require('./server/models').User;
let data = User.find({where: {email: "[email protected]"}})
.then(function (foundUser) {
console.info(foundUser.dataValues);
return foundUser.dataValues;
});
const resolvers = {
Query: {
user(root, args){
return data;
}
}
};
Когда клиент запрашивает конечную точку graphql:
query Query{
user(email:"[email protected]") {
email
}
}
Они всегда получают:
{
"data": {
"user": {
"email": "[email protected]"
}
}
}
Что нормально! Это ожидаемое поведение. Как есть, любой параметр может быть передан в запрос с пользователем (электронная почта: "[email protected]"), и результаты будут такими же. Опять же, это ожидалось.
Однако, когда я перемещаю код, чтобы запрос данных из базы данных находился в преобразователе, например:
const resolvers = {
Query: {
user(root, args){
User.find({where: {email: "[email protected]"}})
.then(function (foundUser) {
console.info(foundUser.dataValues);
return foundUser.dataValues;
});
}
}
};
клиент всегда будет получать это как ответ от конечной точки graphql, используя тот же запрос, что и раньше (однако console.info выводит соответствующую информацию):
{
"data": {
"user": null
}
}
Я подозреваю, что не понимаю, как apollo-server-express / graphql-tools обрабатывает обещание, но я не совсем уверен, как двигаться дальше с этого момента. Любая помощь очень ценится.





Вам просто нужно добавить return перед User, чтобы ваши обещания были правильно связаны.
const resolvers = {
Query: {
user(root, args){
User.find({where: {email: "[email protected]"}})
.then(function (foundUser) {
return foundUser.dataValues;
});
}
}
};
В вашем предыдущем коде (когда вызов вашей модели находился вне резолвера) вы возвращали data внутри резолвера. В этом случае data на самом деле был не результатом вашего запроса к базе данных, а обещанием, которое будет разрешено в этот результат запроса. В обновленном коде у вас все еще есть обещание, но вы не возвращаете его внутри своей функции преобразователя. GraphQL будет принимать возвращаемое значение и ожидать его, если это обещание, или иным образом использовать значение как есть - поскольку вы фактически возвращаете undefined, это то, что преобразователь использует для значения user.
Возможный дубликат Почему запрос GraphQL возвращает null?