【问题标题】:Associated Data Not Returned From Apollo to Client?相关数据未从 Apollo 返回给客户?
【发布时间】:2017-11-05 02:11:54
【问题描述】:

这里是相关的 Apollo 代码。 (许多数据库字段已被省略,以使其更快/更容易阅读这篇文章。)

连接器

const userAccountsDataModel = db.define('userAccountsData', {
    id: {type: Sequelize.STRING, primaryKey: true},
    picture_medium: {type: Sequelize.STRING}
});


const associatesDataModel =  db.define('associatesData', {
    _id: {type: Sequelize.STRING, primaryKey: true},
    first_name: {type: Sequelize.STRING},
    last_name: {type: Sequelize.STRING},
    userID: {type: Sequelize.STRING},
});

associatesDataModel.belongsTo(userAccountsDataModel, {foreignKey: 'userID'});

架构

type userAccountsData {
    id: String
    picture_medium: String
}

type associatesData {
    _id: String
    first_name: String
    last_name: String
    userID: String
    userAccountsData: [userAccountsData]
}

查询

const GETONEASSOCIATE_QUERY = gql`
query getOneAssociate($_id: String!) {
  getOneAssociate(_id: $_id) {
    _id
    first_name
    last_name
    userID 
    accountsData{
        id
        picture_medium
      }
  }
} `;

解析器

getOneAssociate(_, args)  {
    console.log('in getOneAssociate');
    var ret = connectors.associatesData.findAll({
        where: args,
        include: [connectors.userAccountsData],
        logging: console.log
    }).then((res) => res.map((item) => item.dataValues));

    return ret;
},

解析器通过 Sequelize 生成以下 SQL:

SELECT "associatesData"."_id", 
       "associatesData"."first_name", 
       "associatesData"."last_name", 
       "associatesData"."userID", 
       "userAccountsDatum"."id" AS "userAccountsDatum.id", 
       "userAccountsDatum"."picture_medium" AS "userAccountsDatum.picture_medium" 
FROM "associatesDatas" AS "associatesData" 
   LEFT OUTER JOIN "userAccountsData" AS "userAccountsDatum" 
                ON "associatesData"."userID" = "userAccountsDatum"."id" 
WHERE "associatesData"."_id" = '35';

当我在我的 SQL 客户端中运行上述 SQL 时,我可以看到所有搜索的数据都被返回,包括来自相关“userAccountsData”表的数据。

但是,当数据到达我在浏览器中运行 javascript 的客户端代码时,相关表中的数据丢失了——应该包含它的对象为空。

我错过了什么?

提前感谢大家提供任何信息!

【问题讨论】:

  • 没有必要做res.map((item) => item.dataValues)。尝试返回整个res
  • 虽然不需要res.map,但返回整个res 并不能解决异常。

标签: postgresql sequelize.js graphql apollo apollo-client


【解决方案1】:

这被证明是 Sequelize 自动复数表名的异常情况。

默认情况下,Sequelize 会自动将表名复数。应该可以通过使用 Sequelize 的 freezeTableName 属性来关闭此行为。但是,根据this Sequelize issue post,在某些情况下,Sequelize 会忽略freezeTableName 属性并将表名复数(有时是单数)。

在发现这一点后,我能够通过复数相关表名并查看我所有的 Apollo 代码来更新对该表的引用,以便它们也可以复数来解决异常。

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 1970-01-01
    • 2017-04-02
    • 2021-02-16
    • 2020-05-15
    • 2019-06-25
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多