Graphiql返回所有项目而不是特定项目

时间:2018-03-20 12:15:17

标签: javascript node.js graphql

我正在尝试通过调用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]!

  }
`;

1 个答案:

答案 0 :(得分:1)

您的启动板显示的架构包含一个解析为单一类型(Author)的查询。您没有在问题中包含架构,但我猜测查询allItems应该返回一个List(类似[Item])。如果GraphQL需要List,那么你的解析器需要返回一个数组,而不是一个对象。

Lodash的find(以及内置的数组方法)接受一个数组并从该数组中返回一个项目。如果找不到符合您指定条件的项目,它将返回undefined。

这意味着您可能希望使用filter而不是find来将数组简化为传入ID的项目。

此外,getAllLinks会返回一个承诺,因此在使用filterfind之类的内容修改结果之前,您需要先解析它。像

这样的东西
allItems: (_, { id }) => getAllLinks().then(result => filter(result, {id: id}))
// or
allItems: async (_, { id }) => filter(await getAllLinks(), {id: id})