【问题标题】:node.js graphql/sequelize server returns null for linked propertiesnode.js graphql/sequelize 服务器为链接属性返回 null
【发布时间】:2018-06-29 10:51:57
【问题描述】:

我有一个 node.js 服务器,它使用 sequelize 和 graphql 来提供 GraphQL 端点。

在 GraphQL 查询输出中,以某种方式与 belongsTo 链接的对象字段始终为 null

这是我的 graphql typedef:

type Student {
  id: ID!
  name: String!
  age: Int!
  schoolClass: SchoolClass
}

type SchoolClass {
  id: ID!
  title: String!
}

sequelize 模型是这样定义的

const SchoolClass = sequelize.define('SchoolClass', {
  title: Sequelize.STRING
});

const Student = sequelize.define('Student', {
  name: Sequelize.STRING,
  age: Sequelize.TINYINT
});

Student.belongsTo(SchoolClass);

解析器是

students (root, args, context) {
    return models.Student.findAll({}, context);
}

查询:

{ 
  students { 
    id, name, age, schoolClass { id } 
  } 
}

典型输出:

{
  "data": {
    "students": [
      {
        "id": "1",
        "name": "John",
        "age": "18",
        "schoolClass": null
      }
    ]
  }
}

有什么方法可以获取实际数据而不是空值?

【问题讨论】:

  • 学生表有class_id/classId吗?
  • @VivekDoshi 是的,它有 SchoolClassId 字段并填写了适当的 ID(我将 Class 重命名为 SchoolClass,以免将此实体与 JS Class 混淆)
  • 看看这个:github.com/mickhansen/graphql-sequelize,觉得这对你有帮助

标签: node.js sequelize.js graphql-js


【解决方案1】:

默认情况下,调用findAll 时,Sequelize 不会填充任何由关系创建的字段。您必须使用include 选项来指定要包含查询的关系。请参阅the docs 了解更多信息。

此外,findAll 只接受一个参数(一个选项对象),我不太确定您通过将上下文传递给模型来尝试做什么。这应该足以让所有学生获得相关的 schoolClass:

return models.Student.findAll({ include: [ 'SchoolClass' ] })

Check out the reference for findAll 了解有关您可以使用哪些选项的更多信息。

【讨论】:

  • 问题出在我在这里粘贴的代码之外,它在 graphql 解析器中。 return 缺少函数 Student: { class(student) { student.getClass(); } }
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 2019-08-20
  • 2021-04-04
  • 2019-09-24
  • 1970-01-01
  • 2019-07-08
  • 2021-08-18
  • 2017-06-09
相关资源
最近更新 更多