GraphQL + Sequelize解析器,提供空数据

时间:2018-04-13 20:35:13

标签: sequelize.js graphql-js apollo-server

使用中的技术:

  • 运行http服务器的NodeJS
  • ExpressJS框架
  • Apollo-server-express for graphQL
  • 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会输出相应的信息):

{
  "data": {
    "user": null
  }
}

我怀疑我无法理解apollo-server-express / graphql-tools如何处理这个承诺,但我不确定如何从这一点向前推进。任何帮助深表感谢。

2 个答案:

答案 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 })
            );
        }),