2017-06-04 23 views
0

这是相关的阿波罗密码。 (许多数据库字段已使其更快/更容易阅读这篇文章被省略。)未从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'}); 

SCHEMA

type userAccountsData { 
    id: String 
    picture_medium: String 
} 

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

QUERY

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

RESOLVER

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浏览器中运行时,相关表中的数据丢失 - 应包含它的对象为空。

我错过了什么?

在此先感谢所有的任何信息!

+0

没有必要做'res.map((item)=> item.dataValues)'。尝试返回整个'res' –

+0

虽然不需要'res.map',但是返回整个'res'不能解决异常。 – VikR

回答

0

事实证明,这是Sequelize自动复制表名的一种反常现象。

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

在发现这个之后,我通过复用相关表名并遍历所有Apollo代码来更新对此表的引用,以便它们也被复用,从而解决了异常。

相关问题