使用中的技术:
我正在尝试让graphQL在我的节点服务器上运行。我特别遇到问题的地方是graphql解析器。
我有以下代码,工作正常。
let User = require('./server/models').User;
let data = User.find({where: {email: "Test@gmail.com"}})
.then(function (foundUser) {
console.log(foundUser.dataValues);
return foundUser.dataValues;
});
const resolvers = {
Query: {
user(root, args){
return data;
}
}
};
当客户端查询graphql端点时:
query Query{
user(email:"literallyanything@cangohereATM.com") {
email
}
}
他们总是得到:
{
"data": {
"user": {
"email": "Test@gmail.com"
}
}
}
哪个好!这是预期的行为。因此,任何参数都可以通过用户传递到查询中(电子邮件:“literallyanything@cangohereATM.com”),结果将是相同的。再次,这是预期的。
但是当我移动代码时,数据库中的数据请求就像解析器一样:
const resolvers = {
Query: {
user(root, args){
User.find({where: {email: "Test@gmail.com"}})
.then(function (foundUser) {
console.log(foundUser.dataValues);
return foundUser.dataValues;
});
}
}
};
客户端将始终使用与之前相同的查询从graphql端点获取此响应(但是console.log会输出相应的信息):
{
"data": {
"user": null
}
}
我怀疑我无法理解apollo-server-express / graphql-tools如何处理这个承诺,但我不确定如何从这一点向前推进。任何帮助深表感谢。
答案 0 :(得分:1)
您只需在return
之前添加User
,以确保您的Promise被正确链接。
const resolvers = {
Query: {
user(root, args){
User.find({where: {email: "Test@gmail.com"}})
.then(function (foundUser) {
return foundUser.dataValues;
});
}
}
};
在您之前的代码中(当您对模型的调用驻留在解析程序之外时),您将在解析程序内返回data
。在这种情况下,data
实际上不是您的数据库查询结果,而是一个将解析为该查询结果的Promise。在您更新的代码中,您仍然拥有Promise,但是您无法在解析器功能中返回它。 GraphQL将获取返回值并等待它,如果它是一个Promise,或以其他方式使用该值 - 因为您实际返回undefined
,这是解析器用于{的值的内容{1}}。
答案 1 :(得分:0)
更漂亮的解决方案
const resolvers = {
Query: {
user(root, args){
User.find({where: {email: "Test@gmail.com"}})
.then(function (foundUser) {
return foundUser.get({ plain: true })
});
}
}
};
和数组
.then(function(resArray) {
return resArray.map(
el => el.get({ plain: true })
);
}),