Экран продукта не отображает товар, имеет статус ошибки 500.

Вопрос или проблема

Я пишу магазин с использованием React + Django. После использования Redux экран продукта выдает ошибку.

Запрос завершился неудачно с кодом состояния 500

введите описание изображения здесь

Это ошибка, которую я записал в блоке кода.

Тем не менее, он должен выглядеть так, когда я выбираю продукт:

введите описание изображения здесь

HomeScreen выглядит так:

введите описание изображения здесь

Мои блоки кода:

ProductActions:

import  axios from 'axios'
import { 
    PRODUCT_LIST_REQUEST,
    PRODUCT_LIST_SUCCESS,
    PRODUCT_LIST_FAIL,
    PRODUCT_DETAILS_REQUEST,
    PRODUCT_DETAILS_SUCCESS,
    PRODUCT_DETAILS_FAIL,
} from '../constants/productConstants'

export const listProducts = () => async (dispatch) => {
    try {
        dispatch({ type: PRODUCT_LIST_REQUEST })

        const { data } = await axios.get('/api/products/')
        dispatch({
            type: PRODUCT_LIST_SUCCESS,
            payload: data
        })
    } catch (error) {
        dispatch({
            type: PRODUCT_LIST_FAIL,
            payload: error.response && error.response.data.message
                ? error.response.data.message
                : error.message,
        })
    }
}

export const listProductDetails = (id) => async (dispatch) => {
    try {
        dispatch({ type: PRODUCT_DETAILS_REQUEST })

        const { data } = await axios.get('/api/products/${id}')
        dispatch({
            type: PRODUCT_DETAILS_SUCCESS,
            payload: data
        })
    } catch (error) {
        dispatch({
            type: PRODUCT_DETAILS_FAIL,
            payload: error.response && error.response.data.message
                ? error.response.data.message
                : error.message,
        })
    }
}

ProductReducers:

import { 
    PRODUCT_LIST_REQUEST,
    PRODUCT_LIST_SUCCESS,
    PRODUCT_LIST_FAIL,
    PRODUCT_DETAILS_REQUEST,
    PRODUCT_DETAILS_SUCCESS,
    PRODUCT_DETAILS_FAIL,
 } from '../constants/productConstants'

export const productListReducer = (state = { products: [] }, action) => {
    switch(action.type) {
        case PRODUCT_LIST_REQUEST:
            return { loading: true, products: [] }
        
        case PRODUCT_LIST_SUCCESS:
            return { loading: false, products: action.payload }
        
        case PRODUCT_LIST_FAIL:
            return { loading: false, error: action.payload }    
            
        default:
            return state    
    }
}

export const productDetailsReducer = (state = { product: { reviews: [] } }, action) => {
    switch(action.type) {
        case PRODUCT_DETAILS_REQUEST:
            return { loading: true, ...state }
        
        case PRODUCT_DETAILS_SUCCESS:
            return { loading: false, product: action.payload }
        
        case PRODUCT_DETAILS_FAIL:
            return { loading: false, error: action.payload }    
             
        default:
            return state    
    }
}

ProductConstants:

export const PRODUCT_LIST_REQUEST = 'PRODUCT_LIST_REQUEST'
export const PRODUCT_LIST_SUCCESS = 'PRODUCT_LIST_SUCCESS'
export const PRODUCT_LIST_FAIL = 'PRODUCT_LIST_FAIL'
export const PRODUCT_DETAILS_REQUEST = 'PRODUCT_DETAILS_REQUEST'
export const PRODUCT_DETAILS_SUCCESS = 'PRODUCT_DETAILS_SUCCESS'
export const PRODUCT_DETAILS_FAIL = 'PRODUCT_DETAILS_FAIL'

Store:

import { legacy_createStore as createStore, combineReducers, applyMiddleware } from 'redux';
import { thunk } from 'redux-thunk';
import { composeWithDevTools } from '@redux-devtools/extension';
import { productListReducer, productDetailsReducer } from './reducers/productReducers'

const reducer = combineReducers({
    productList: productListReducer,
    productDetails: productDetailsReducer,
})

const initialState= {}

const middleware = [thunk]
const store=createStore(
    reducer,
    initialState,
    composeWithDevTools(applyMiddleware(...middleware))
)

export default store

HomeScreen:

import React, { useState, useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { Row, Col } from 'react-bootstrap'
import Product from '../components/Product'
import Loader from '../components/Loader'
import Message from '../components/Message'
import { listProducts } from '../actions/productActions'

function HomeScreen () {
    const dispatch = useDispatch()
    const productList = useSelector(state => state.productList)
    const { error, loading, products } = productList

    useEffect(() => {
        dispatch(listProducts())
    }, [dispatch])

    return (
        <div>
            <h1>Последние продукты</h1>
            {loading ? <Loader />
                : error ? <Message variant="danger">{error}</Message>
                : 
                <Row>
                    {products.map(product => (
                        <Col key={product._id} sm={12} md={6} lg={4} xl={3}>
                        <Product product={product} />
                        </Col>
                ))}
            </Row>
        }
        </div>
    )
}

export default HomeScreen

Ответ или решение

Разбор проблемы с ошибкой 500 на экране продуктов в приложении на React + Django

Ошибка 500, возникающая на экране продукта в вашем магазине, указывает на внутреннюю проблему на сервере. Важно тщательно разобрать код и логику работы приложения для определения источника ошибки. Давайте проанализируем предоставленные фрагменты кода и предложим возможные решения.

1. Анализ кода ProductActions

В вашем файле ProductActions функция listProductDetails содержит ошибку в синтаксисе при использовании шаблонных строк JavaScript. Проблема заключается в том, что вы обернули URL адрес с помощью одинарных кавычек вместо обратных (`). Это приводит к тому, что переменнаяid` не заменяется на реальное значение.

Исправление:

const { data } = await axios.get(`/api/products/${id}`);

2. Проверка состояния и логи сервера

При получении ошибки 500 от сервера, полезно обратиться к логам на стороне Django:

  • Включите режим отладки (DEBUG) в настройках вашего Django-приложения (settings.py) для получения более подробной информации об ошибках. Убедитесь, что DEBUG установлен в True на этапе разработки (но не в производственной среде).
  • Проверьте, какие запросы приходят на сервер и обрабатываются ли они должным образом. Часто ошибка 500 может возникать из-за неправильной работы с базой данных или пустых значений в полях.

3. Проверьте эндпоинты API

Убедитесь, что указанные эндпоинты существуют и работают корректно. Выполните запросы к API с помощью инструмента, например, Postman, для проверки правильности функционирования:

  • GET /api/products/ должен возвращать список продуктов.
  • GET /api/products/{id} должен возвращать детали конкретного продукта.

4. Обработка ошибок в Redux

В вашем Redux-коде вы правильно обрабатываете ошибки, но убедитесь, что состояние ошибок инициируется и отображается корректно:

  • Проверьте, правильно ли отображается компонент <Message /> на экране. Это может быть важным для отображения информации о полученной ошибке.

5. Ошибки на стороне клиента

На стороне клиента проверьте наличие следующих моментов:

  • Верно ли имплементирован компонент Loader для индикатора загрузки.
  • Убедитесь, что ваш компонент Product получает корректные данные и отображает их без ошибок.

Заключение

Рекомендую следовать приведенным выше шагам, чтобы диагностировать и решить проблему с ошибкой 500 на экране продукта. Логирование на стороне сервера и корректное использование API могут существенно упростить процесс решения. После внесения изменений, всегда проверяйте работоспособность системы и наличие ошибок в консоли браузера. Это поможет вам избегать подобных проблем в будущем и обеспечит безупречный пользовательский опыт.

Оцените материал
Добавить комментарий

Капча загружается...