我正在尝试通过调用api获取特定项目并在查询中设置参数。我正在尝试使用find函数但是在解决graphiql中的查询时它给了我错误 这是我的承诺api函数。
var request = require('request');
var options = { method: 'GET',
url: 'myurl',
qs: { searchCriteria: '' },
headers:
{ 'postman-token': '12d2dbd7-6ea1-194c-ad38-5bffbac6706c',
'cache-control': 'no-cache',
authorization: 'Bearer b0kk2w8ptk9smhnl4ogh4y40adly0s5h',
'content-type': 'application/json' } };
const getAllLinks = () => {
return new Promise((resolve, reject) => {
request(options, function (error, response, body) {
//console.log(body);
if (error) {
reject(error);
}
else {
const myJSON = JSON.parse(body);
resolve(myJSON.items);
//console.log(myJSON.items);
}
});
});
};
const testAllLinks = () => {
return getAllLinks().then((res) => {
return res;
})
};
然后在这里我的解析器,查询应该从api返回所有项目的特定id。
Query: {
allItems: (_, { id }) => find(getAllLinks(), {id: id}),
但我一直收到错误Cannot return null for non-nullable field Query.allItems.
我在模式(allItems(id: Int): [Item]!
)中允许参数。
当我将解析器中的查询更改为:
allItems: () => getAllLinks(), //or testAllLinks()
它会返回所有项目。
在这里,我使用find函数https://launchpad.graphql.com/r9wk3kpk8n为此示例创建了启动板,它可以在那里工作,但不是在这里......
架构:
const typeDefs = `
type Item {
id: ID!
sku: String!
name: String!
attribute_set_id: Int!
price: Float
status: Int!
visibility: Int!
type_id: String!
created_at: String!
updated_at: String!
product_links: [String]
tier_prices: [Int]
custom_attributes: [CUSTOM_ATTRIBUTES]
}
union CUSTOM_ATTRIBUTES = CustomString | CustomArray
type CustomString {
attribute_code: String
value: String
}
type CustomArray {
attribute_code: String
value: [String]
}
type Query {
allItems(id: Int): [Item]!
}
`;
答案 0 :(得分:1)
您的启动板显示的架构包含一个解析为单一类型(Author
)的查询。您没有在问题中包含架构,但我猜测查询allItems
应该返回一个List(类似[Item]
)。如果GraphQL需要List,那么你的解析器需要返回一个数组,而不是一个对象。
Lodash的find
(以及内置的数组方法)接受一个数组并从该数组中返回一个项目。如果找不到符合您指定条件的项目,它将返回undefined。
这意味着您可能希望使用filter
而不是find
来将数组简化为传入ID的项目。
此外,getAllLinks
会返回一个承诺,因此在使用filter
或find
之类的内容修改结果之前,您需要先解析它。像
allItems: (_, { id }) => getAllLinks().then(result => filter(result, {id: id}))
// or
allItems: async (_, { id }) => filter(await getAllLinks(), {id: id})