我正在尝试运行graphql查询,但它一直显示“ TypeError:字符串不能代表值:”错误。
我的查询模式:
type User {
active: Boolean!
email: String!
fullname: String!
description: String!
tags: [String!]!
}
type Query {
getAllUsers: [User]!
}
我的解析器:
Query: {
getAllUsers: (_, __, { dataSources }) => {
return dataSources.userAPI.getAllUsers();
}
}
userAPI:
getAllUsers() {
const params = {
TableName: 'Users',
Select: 'ALL_ATTRIBUTES'
};
return new Promise((resolve, reject) => {
dynamodb.scan(params, function(err, data) {
if (err) {
console.log('Error: ', err);
reject(err);
} else {
console.log('Success');
resolve(data.Items);
}
});
});
}
查询:
query getAllUsers{
getAllUsers{
email
}
}
由于我的电子邮件是字符串,所以我得到的错误是“字符串不能代表值”。
答案 0 :(得分:1)
解析器内部返回的内容应与架构指定的形状匹配。如果您的用户架构为
type User {
active: Boolean!
email: String!
fullname: String!
description: String!
tags: [String!]!
}
然后返回的用户数组应如下所示:
[{
active: true,
email: 'kaisinnn@li.com',
fullname: 'Kaisin Li',
description: 'Test',
tags: ['SOME_TAG']
}]
您实际返回的数据的形状有很大不同:
[{
active: {
BOOL: true
},
description: {
S: 'Test'
},
fullname: {
S: 'Kaisin Li'
},
email: {
S: 'kaisinnn@li.com'
},
}]
您需要或者映射到您从扫描操作中获得的阵列,并将结果转换为正确的形状,或者为每个单独的字段编写一个解析器。例如:
const resolvers = {
User: {
active: (user) => user.active.BOOL,
description: (user) => user.description.S,
// and so on
}
}