node.js graphql/sequelize 服务器为链接属性返回 null

Posted

技术标签:

【中文标题】node.js graphql/sequelize 服务器为链接属性返回 null【英文标题】:node.js graphql/sequelize server returns null for linked properties 【发布时间】: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,觉得这对你有帮助 【参考方案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();

以上是关于node.js graphql/sequelize 服务器为链接属性返回 null的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL 嵌套突变 + Sequelize

用 graphql-sequelize 解决“IS A”关系

GraphQL/Sequelize:SQL 别名

meteor apollo graphql/sequelize 缓存查询结果,避免多次相同查询

Node.js 入门

Node.js 模块