我不断收到一条错误消息,指出“加载资源失败:服务器响应状态为 500(内部服务器错误)”

问题描述 投票:0回答:1

我正在建立一个多供应商电子商务网站。我目前正在尝试实施管理员以便能够删除产品。我不断收到一条错误消息,指出“加载资源失败:服务器响应状态为 500(内部服务器错误)”。有任何想法吗?在我的 productRouter.js 中,我有以下路线:

        import express from 'express';
    import expressAsyncHandler from 'express-async-handler';
    import data from '../data.js';
    import Product from '../models/productModel.js';
    import { isAdmin, isAuth } from '../utils.js';
    const productRouter = express.Router();
    productRouter.get(
      '/',
      expressAsyncHandler(async (req, res) => {
        const products = await Product.find({});
        res.send(products);
      })
    );
    productRouter.get(
      '/seed',
      expressAsyncHandler(async (req, res) => {
        // await Product.remove({});
        const createdProducts = await Product.insertMany(data.products);
        res.send({ createdProducts });
      })
    );
    productRouter.get(
      '/:id',
      expressAsyncHandler(async (req, res) => {
        const product = await Product.findById(req.params.id);
        if (product) {
          res.send(product);
        } else {
          res.status(404).send({ message: 'Product Not Found' });
        }
      })
    );
    productRouter.post(
      '/',
      isAuth,
      isAdmin,
      expressAsyncHandler(async (req, res) => {
        const product = new Product({
          name: 'sample name ' + Date.now(),
          image: '/images/p1.jpg',
          price: 0,
          category: 'sample category',
          brand: 'sample brand',
          countInStock: 0,
          rating: 0,
          numReviews: 0,
          description: 'sample description',
        });
        const createdProduct = await product.save();
        res.send({ message: 'Product Created', product: createdProduct });
      })
    );
    productRouter.put(
      '/:id',
      isAuth,
      isAdmin,
      expressAsyncHandler(async (req, res) => {
        const productId = req.params.id;
        const product = await Product.findById(productId);
        if (product) {
          product.name = req.body.name;
          product.price = req.body.price;
          product.image = req.body.image;
          product.category = req.body.category;
          product.brand = req.body.brand;
          product.countInStock = req.body.countInStock;
          product.description = req.body.description;
          const updatedProduct = await product.save();
          res.send({ message: 'Product Updated', product: updatedProduct });
        } else {
          res.status(404).send({ message: 'Product Not Found' });
        }
      })
    );
    
    productRouter.delete(
      '/:id',
      isAuth,
      isAdmin,
      expressAsyncHandler(async (req, res) => {
        const product = await Product.findById(req.params.id);
        if (product) {
          const deleteProduct = await product.remove();
          res.send({ message: 'Product Deleted', product: deleteProduct });
        } else {
          res.status(404).send({ message: 'Product Not Found' });
        }
      })
    );
    
    export default productRouter;

下面是我的 productActions.js 我一直怀疑错误可能是由这个文件引起的,但我不确定:

        import Axios from 'axios';
    import {
      PRODUCT_CREATE_FAIL,
      PRODUCT_CREATE_REQUEST,
      PRODUCT_CREATE_SUCCESS,
      PRODUCT_DETAILS_FAIL,
      PRODUCT_DETAILS_REQUEST,
      PRODUCT_DETAILS_SUCCESS,
      PRODUCT_LIST_FAIL,
      PRODUCT_LIST_REQUEST,
      PRODUCT_LIST_SUCCESS,
      PRODUCT_UPDATE_REQUEST,
      PRODUCT_UPDATE_SUCCESS,
      PRODUCT_UPDATE_FAIL,
      PRODUCT_DELETE_REQUEST,
      PRODUCT_DELETE_FAIL,
      PRODUCT_DELETE_SUCCESS,
    } from '../constants/productConstants';
    
    export const listProducts = () => async (dispatch) => {
      dispatch({
        type: PRODUCT_LIST_REQUEST,
      });
      try {
        const { data } = await Axios.get('/api/products');
        dispatch({ type: PRODUCT_LIST_SUCCESS, payload: data });
      } catch (error) {
        dispatch({ type: PRODUCT_LIST_FAIL, payload: error.message });
      }
    };
    export const detailsProduct = (productId) => async (dispatch) => {
      dispatch({ type: PRODUCT_DETAILS_REQUEST, payload: productId });
      try {
        const { data } = await Axios.get(`/api/products/${productId}`);
        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,
        });
      }
    };
    export const createProduct = () => async (dispatch, getState) => {
      dispatch({ type: PRODUCT_CREATE_REQUEST });
      const {
        userSignin: { userInfo },
      } = getState();
      try {
        const { data } = await Axios.post(
          '/api/products',
          {},
          {
            headers: { Authorization: `Bearer ${userInfo.token}` },
          }
        );
        dispatch({
          type: PRODUCT_CREATE_SUCCESS,
          payload: data.product,
        });
      } catch (error) {
        const message =
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message;
        dispatch({ type: PRODUCT_CREATE_FAIL, payload: message });
      }
    };
    export const updateProduct = (product) => async (dispatch, getState) => {
      dispatch({ type: PRODUCT_UPDATE_REQUEST, payload: product });
      const {
        userSignin: { userInfo },
      } = getState();
      try {
        const { data } = await Axios.put(`/api/products/${product._id}`, product, {
          headers: { Authorization: `Bearer ${userInfo.token}` },
        });
        dispatch({ type: PRODUCT_UPDATE_SUCCESS, payload: data });
      } catch (error) {
        const message =
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message;
        dispatch({ type: PRODUCT_UPDATE_FAIL, error: message });
      }
    };
    export const deleteProduct = (productId) => async (dispatch, getState) => {
      dispatch({ type: PRODUCT_DELETE_REQUEST, payload: productId });
      const {
        userSignin: { userInfo },
      } = getState();
      try {
        await Axios.delete(`/api/products/${productId}`, {
          headers: { Authorization: `Bearer ${userInfo.token}` },
        });
        dispatch({ type: PRODUCT_DELETE_SUCCESS });
      } catch (error) {
        const message =
          error.response && error.response.data.message
            ? error.response.data.message
            : error.message;
        dispatch({ type: PRODUCT_DELETE_FAIL, payload: message });
      }
    };
    

接下来我有我的 productConstants,但我认为实际上不需要显示一个,所以下面是我的 productReducers.js:

        import {
      PRODUCT_LIST_REQUEST,
      PRODUCT_LIST_SUCCESS,
      PRODUCT_LIST_FAIL,
      PRODUCT_DETAILS_REQUEST,
      PRODUCT_DETAILS_SUCCESS,
      PRODUCT_DETAILS_FAIL,
      PRODUCT_CREATE_REQUEST,
      PRODUCT_CREATE_SUCCESS,
      PRODUCT_CREATE_FAIL,
      PRODUCT_CREATE_RESET,
      PRODUCT_UPDATE_REQUEST,
      PRODUCT_UPDATE_SUCCESS,
      PRODUCT_UPDATE_FAIL,
      PRODUCT_UPDATE_RESET,
      PRODUCT_DELETE_REQUEST,
      PRODUCT_DELETE_SUCCESS,
      PRODUCT_DELETE_FAIL,
      PRODUCT_DELETE_RESET,
    } from '../constants/productConstants';
    
    export const productListReducer = (
      state = { loading: true, products: [] },
      action
    ) => {
      switch (action.type) {
        case PRODUCT_LIST_REQUEST:
          return { loading: true };
        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 = { loading: true }, action) => {
      switch (action.type) {
        case PRODUCT_DETAILS_REQUEST:
          return { loading: true };
        case PRODUCT_DETAILS_SUCCESS:
          return { loading: false, product: action.payload };
        case PRODUCT_DETAILS_FAIL:
          return { loading: false, error: action.payload };
        default:
          return state;
      }
    };
    export const productCreateReducer = (state = {}, action) => {
      switch (action.type) {
        case PRODUCT_CREATE_REQUEST:
          return { loading: true };
        case PRODUCT_CREATE_SUCCESS:
          return { loading: false, success: true, product: action.payload };
        case PRODUCT_CREATE_FAIL:
          return { loading: false, error: action.payload };
        case PRODUCT_CREATE_RESET:
          return {};
        default:
          return state;
      }
    };
    export const productUpdateReducer = (state = {}, action) => {
      switch (action.type) {
        case PRODUCT_UPDATE_REQUEST:
          return { loading: true };
        case PRODUCT_UPDATE_SUCCESS:
          return { loading: false, success: true };
        case PRODUCT_UPDATE_FAIL:
          return { loading: false, error: action.payload };
        case PRODUCT_UPDATE_RESET:
          return {};
        default:
          return state;
      }
    };
    export const productDeleteReducer = (state = {}, action) => {
      switch (action.type) {
        case PRODUCT_DELETE_REQUEST:
          return { loading: true };
        case PRODUCT_DELETE_SUCCESS:
          return { loading: false, success: true };
        case PRODUCT_DELETE_FAIL:
          return { loading: false, error: action.payload };
        case PRODUCT_DELETE_RESET:
          return {};
        default:
          return state;
      }
    };
    

我也推测错误可能是由我下面的 ProductListScreen.js 引起的:

                import React, { useEffect } from 'react';
            import { useDispatch, useSelector } from 'react-redux';
            import { Link, useParams, useNavigate } from 'react-router-dom';
            import {
              createProduct,
              deleteProduct,
              listProducts,
            } from '../actions/productActions';
            import LoadingBox from '../components/LoadingBox';
            import MessageBox from '../components/MessageBox';
            import {
              PRODUCT_CREATE_RESET,
              PRODUCT_DELETE_RESET,
            } from '../constants/productConstants';
            
            export default function ProductListScreen(props) {
              const navigate = useNavigate();
              const productList = useSelector((state) => state.productList);
              const { loading, error, products } = productList;
            
              const productCreate = useSelector((state) => state.productCreate);
              const {
                loading: loadingCreate,
                error: errorCreate,
                success: successCreate,
                product: createdProduct,
              } = productCreate;
          
              const productDelete = useSelector((state) => state.productDelete);
              const {
                loading: loadingDelete,
                error: errorDelete,
                success: successDelete,
              } = productDelete;
          
              const dispatch = useDispatch();
              useEffect(() => {
                if (successCreate) {
                  dispatch({ type: PRODUCT_CREATE_RESET });
                  navigate(`/product/${createdProduct._id}/edit`);
                }
                if (successDelete) {
                  dispatch({ type: PRODUCT_DELETE_RESET });
                }
                dispatch(listProducts());
              }, [createdProduct, dispatch, navigate, successCreate, successDelete]);
          
              const deleteHandler = (product) => {
                if (window.confirm('Are you sure to delete?')) {
                  dispatch(deleteProduct(product._id));
                }
              };
              const createHandler = () => {
                dispatch(createProduct());
              };
              return (
                <div>
                  <div className="row">
                    <h1>Products</h1>
                    <button type="button" className="primary" onClick={createHandler}>
                      Create Product
                    </button>
                  </div>
            
                  {loadingDelete && <LoadingBox></LoadingBox>}
                  {errorDelete && <MessageBox variant="danger">{errorDelete}</MessageBox>}
            
                  {loadingCreate && <LoadingBox></LoadingBox>}
                  {errorCreate && <MessageBox variant="danger">{errorCreate}</MessageBox>}
                  {loading ? (
                    <LoadingBox></LoadingBox>
                  ) : error ? (
                    <MessageBox variant="danger">{error}</MessageBox>
                  ) : (
                    <table className="table">
                      <thead>
                        <tr>
                          <th>ID</th>
                          <th>NAME</th>
                          <th>PRICE</th>
                          <th>CATEGORY</th>
                          <th>BRAND</th>
                          <th>ACTIONS</th>
                        </tr>
                      </thead>
                      <tbody>
                        {products.map((product) => (
                          <tr key={product._id}>
                            <td>{product._id}</td>
                            <td>{product.name}</td>
                            <td>{product.price}</td>
                            <td>{product.category}</td>
                            <td>{product.brand}</td>
                            <td>
                              <button
                                type="button"
                                className="small"
                                onClick={() => navigate(`/product/${product._id}/edit`)}
                              >
                                Edit
                              </button>
                              <button
                                type="button"
                                className="small"
                                onClick={() => deleteHandler(product)}
                              >
                                Delete
                              </button>
                            </td>
                          </tr>
                        ))}
                      </tbody>
                    </table>
                  )}
                </div>
              );
            }
            

就这些了

javascript e-commerce mern
1个回答
-1
投票

同样的错误任何解决方案

© www.soinside.com 2019 - 2024. All rights reserved.