Ошибка типа: данные.Order.map не является функцией ( react и graphql)

#javascript #reactjs #graphql #jsx #react-apollo

#javascript #reactjs #graphql #jsx #реагировать-apollo

Вопрос:

Я пытаюсь получить данные из graphql с помощью react, цель состоит в том, чтобы получить данные одного заказа! я создал список всех заказов, и он работает нормально, но когда я попытался получить данные для заказа sigle на другой странице, это не сработало :

Компонент OrderDetails :

 import React from 'react'
import { gql, useQuery } from '@apollo/client';
import Table  from 'react-bootstrap/Table'
import { Link } from 'react-router-dom';
const GET_Single_Orders = gql`
query Order($id: ID!){
    Order (id: $id){
      id
      displayFinancialStatus
          displayFulfillmentStatus
          email
          id
          createdAt
          subtotalPrice
          totalRefunded
          totalShippingPrice
          totalPrice
          totalTax
          updatedAt
          lineItems{
              edges {
                  node {
                      customAttributes{
                          key
                          value
                      }
                      quantity
                      title
                      id
                      variant{
                          id
                          title
                          weight
                          weightUnit
                          price
                          image {
                              src
                          }
                      }
                  }
              }
          }
          shippingAddress {
              address1
              address2
              city
              company
              country
              countryCode
              firstName
              id
              lastName
              name
              phone
              province
              provinceCode
              zip
          }
    }
  }
`;

export default function OrderDetails(props) {
    let  id  = props.match.params.id;
   id = "gid://shopify/Order/"   id ;
  const { loading, error, data } = useQuery(GET_Single_Orders, {
    variables:  {id}
    ,
  });

  if (loading) return <h4>Loading...</h4>;
  if (error) return `Error! ${error}`;

  return( <div>
  
 <Table striped bordered responsive hover size="sm">
  <thead>
    <tr>
    
      <th>Created at</th>
      <th>created by</th>
      <th>Fulfillment</th>
      <th>Financial Status</th>
      <th>total Price</th>
      <th>Action</th>
 
    </tr>
  </thead>
  <tbody>
 {data.Order.map(({ Order , createdAt , totalPrice  }) => (
  
    <tr key={totalPrice}>
   
     <td>{createdAt} </td>
   
    </tr>
  
  ))}
  </tbody>
</Table>

 </div>
 )}
 

но я получил эту ошибку (ошибка типа: данные.Order.map не является функцией) я не знаю, почему я это получил! как это исправить?

схема порядка запросов :

 {
  "data": {
    "Order": {
      "id": "gid://shopify/Order/2950331957398",
      "displayFinancialStatus": "REFUNDED",
      "displayFulfillmentStatus": "UNFULFILLED",
      "email": "bla@gmail.com",
      "createdAt": "2020-11-19T15:13:44Z",
      "subtotalPrice": "3795",
      "totalRefunded": "4445",
      "totalShippingPrice": "650",
      "totalPrice": "4445",
      "totalTax": "345",
      "updatedAt": "2019-1-24T07:33:42Z",
      "lineItems": {
        "edges": [
          {
            "node": {
              "customAttributes": [],
              "quantity": 1,
              "title": "bla",
              "id": "gid://shopify/LineItem/12345678",
              "variant": {
                "id": "gid://shopify/ProductVariant/12345678",
                "title": "ブラウン / ONE",
                "weight": 0,
                "weightUnit": "KILOGRAMS",
                "price": "3795",
             
              }
            }
          }
        ]
      },
      "shippingAddress": {
        "address1": "adresse here",
        "address2": "",
        "city": "city here",
        "company": null,
        "country": "Japan",
        "countryCode": "JP",
        "firstName": "コウスケ",
        "id": "gid://shopify/MailingAddress/123456789?model_name=Address",
        "lastName": "bla",
        "name": "bla",
        "phone": null,
        "province": "Tōkyō",
        "provinceCode": "JP-13",
        "zip": "187-0022"
      }
    }
  }
}
 

Комментарии:

1. data.Order должно быть, возвращаемый объект, и вы пытаетесь нанести его на карту. Пожалуйста, проверьте

2. можете ли вы привести пример кода, как это сделать? это будет полезно ! Спасибо

3. Можете ли вы поделиться схемой запроса Order , чтобы увидеть, что он возвращает? Буквальный объект или массив?

4. готово, я обновил свой пост, пожалуйста, проверьте его еще раз! Спасибо

Ответ №1:

map доступна ли функция в прототипе массива. Возвращаемые данные являются объектом, поэтому вы не можете использовать .map их для объекта. Сделайте это вместо:

   <tbody>
    <tr key={data?.Order?.totalPrice}>
     <td>{data?.Order?.createdAt} </td>   
    </tr>
  </tbody>
 

В идеале, для ключа вы хотели бы сделать что-то вроде Order.id того, что однозначно представляет эту строку.

Комментарии:

1. я заменил детали кодом, который вы предоставили, но это не исправило ошибку, это то же самое!

2. Я обновил свой фрагмент кода, его не должно быть data.Order.map в коде.

3. эта работа для простого файла, но когда я попытался получить более глубокий доступ к чему-то вроде {data? .Order?.ShippingAddress?.company} я ничего не получаю ( ошибок тоже нет), только пустое место, где должны отображаться данные компании! любое решение.?

4. можете ли вы добавить пример в приведенный выше код?

5. Вы ничего не видите, потому что в вашем случае company имеет значение null.