首页 文章

GraphQL Sequelize解析器,提供空数据

提问于
浏览
0

使用技术:

  • 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 endpoints 时:

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 endpoints 获取此响应(但是console.log输出相应的信息):

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

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

2 回答

  • 1

    您只需要在 User 之前添加 return 以确保您的Promise被正确链接 .

    const resolvers = {
      Query: {
        user(root, args){
          User.find({where: {email: "Test@gmail.com"}})
            .then(function (foundUser) {
              return foundUser.dataValues;
            });
        }
      }
    };
    

    在您之前的代码中(当您对模型的调用驻留在解析程序之外时),您在解析程序内返回 data . 在这种情况下, data 实际上不是您的数据库查询结果,而是一个将解析为该查询结果的Promise . 在你更新的代码中,你仍然有一个Promise,但是你没有承诺,或者以其他方式使用该值 - 因为你实际上返回了 undefined ,这就是解析器用于 user 的值 .

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

相关问题