Sequelize.js 图形ql+;提供空数据的Sequelize解析器

Sequelize.js 图形ql+;提供空数据的Sequelize解析器,sequelize.js,graphql-js,apollo-server,Sequelize.js,Graphql Js,Apollo Server,使用中的技术: NodeJS来运行http服务器 ExpressJS框架 用于graphQL的Apollo server express Sequelize可连接到postgres DB 用于存储数据的Postgresql 我正在尝试让graphQL在我的节点服务器上工作。我特别遇到的问题是graphql解析器 我有下面的代码,可以正常工作 let User = require('./server/models').User; let data = User.find({where: {em

使用中的技术:

  • NodeJS来运行http服务器
  • ExpressJS框架
  • 用于graphQL的Apollo server express
  • Sequelize可连接到postgres DB
  • 用于存储数据的Postgresql
我正在尝试让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会输出适当的信息):


我怀疑我没有理解apollo server express/graphql工具是如何处理这个承诺的,但我真的不确定如何从这一点向前推进。非常感谢您的帮助

您只需在
用户
之前添加一个
返回
,以确保您的承诺被正确链接

const resolvers = {
  Query: {
    user(root, args){
      User.find({where: {email: "Test@gmail.com"}})
        .then(function (foundUser) {
          return foundUser.dataValues;
        });
    }
  }
};
在以前的代码中(当对模型的调用位于分解器外部时),您返回的是分解器内部的
数据。在本例中,
data
实际上不是您的数据库查询结果,而是将解析为该查询结果的承诺。在更新后的代码中,您仍然有一个承诺,但不会在解析器函数中返回它。GraphQL将获取返回值并等待它,如果它是一个承诺,或者按原样使用该值——因为您实际上返回了
未定义的
,这就是解析程序用于
用户
的值的可能重复项
const resolvers = {
  Query: {
    user(root, args){
      User.find({where: {email: "Test@gmail.com"}})
        .then(function (foundUser) {
          return foundUser.dataValues;
        });
    }
  }
};