【问题标题】:Error: products.map is not a function Mern Stack错误:products.map 不是函数 Mern Stack
【发布时间】:2021-09-04 12:35:04
【问题描述】:

我正在开发一个电子商务 mern 堆栈,一切正常,直到我决定在 heroku 上部署应用程序,之后我的 HomeScreen.js 中弹出了这个错误 --> 地图不是函数...但在尝试部署它之前,该应用程序运行良好,我在同时运行客户端和服务器以启动应用程序时没有遇到任何问题。

非常感谢任何提示或帮助。谢谢。

HomeScreen.js:

import "./HomeScreen.css";
import { useEffect } from "react";
import { useDispatch, useSelector } from "react-redux";

// Components
import Product from "../components/Product";

//Actions
import { getProducts as listProducts } from "../redux/actions/productActions";

const HomeScreen = () => {
  const dispatch = useDispatch();

  const getProducts = useSelector((state) => state.getProducts);
  const { products, loading, error } = getProducts;

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

  return (
    <div className="homescreen">
      <h2 className="homescreen__title">Latest Products</h2>
      <div className="homescreen__products">
        {loading ? (
          <h2>Loading...</h2>
        ) : error ? (
          <h2>{error}</h2>
        ) : ( 
          products.map((product) => (.       <-- this where the error appears 
            <Product key={product._id}
              name={product.name}
              description={product.description}
              price={product.price}
              mageUrl={product.imageUrl}
              productId={product._id}
            />
          ))
        )}
      </div>
      
    </div>
  );
};

export default HomeScreen;

Product.js:

import "./Product.css";
import { Link } from "react-router-dom";

const Product = ({ imageUrl, description, price, name, productId }) => {
  return (
    <div className="product">
      <img src={imageUrl} alt={name} />

      <div className="product__info">
        <p className="info__name">{name}</p>

        <p className="info__description">{description.substring(0, 100)}...</p>

        <p className="info__price">${price}</p>

        <Link to={`/product/${productId}`} className="info__button">
          View
        </Link>
      </div>
    </div>
  );
};

export default Product;

ProductActions.js:

import * as actionTypes from "../constants/productConstants";
import axios from "axios";

export const getProducts = () => async (dispatch) => {
  try {
    dispatch({ type: actionTypes.GET_PRODUCTS_REQUEST });

    const { data } = await axios.get("/api/products");

    dispatch({
      type: actionTypes.GET_PRODUCTS_SUCCESS,
      payload: data,
    });
  } catch (error) {
    dispatch({
      type: actionTypes.GET_PRODUCTS_FAIL,
      payload:
        error.response && error.response.data.message
          ? error.response.data.message
          : error.message,
    });
  }
};

export const getProductDetails = (id) => async (dispatch) => {
  try {
    dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_REQUEST });

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

    dispatch({
      type: actionTypes.GET_PRODUCT_DETAILS_SUCCESS,
      payload: data,
    });
  } catch (error) {
    dispatch({
      type: actionTypes.GET_PRODUCT_DETAILS_FAIL,
      payload:
        error.response && error.response.data.message
          ? error.response.data.message
          : error.message,
    });
  }
};

export const removeProductDetails = () => (dispatch) => {
  dispatch({ type: actionTypes.GET_PRODUCT_DETAILS_RESET });
};

server.js:

require("dotenv").config();
const path = require('path');
const express = require("express");
const productRoutes = require("./routes/productRoutes");
const connectDB = require("./config/db");


connectDB();

const app = express();

app.use(express.json());

//--------------- deployment -------

__dirname = path.resolve();
if(process.env.NODE_ENV === 'production') {
  app.use(express.static(path.join(__dirname, '/frontend/build')));

  app.get('*',(req,res) => {
    res.sendFile(path.resolve(__dirname, 'frontend','build','index.html'))
  })
  
} else {
  app.get("/", (req, res) => {
    res.send("Api running");
  })
}


app.use("/api/products", productRoutes);

const PORT = process.env.PORT || 5000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

.env:

PORT=5000

MONGO_URI=**********************

NODE_ENV=development

.env.local:

NODE_ENV=production  

PORT=5000

MONGO_URI=************

【问题讨论】:

    标签: javascript reactjs react-redux mern


    【解决方案1】:

    products.map((product) => (.

    将此设置为Array.isArray(products) &amp;&amp; products.map((product) 应该可以解决此问题,因为它只会在产品为数组时运行,否则该块将不会执行。

    但是,它只会防止错误不显示。您仍然需要调试并检查未设置值的位置。

    【讨论】:

    • 嘿,谢谢你的帮助,我照你说的做了,它必须消除错误,但我想显示这些项目,我似乎无法找出问题所在....但这在部署之前可以工作,为什么现在不工作?
    • 你得到了正确的回应吗?如果不是,那可能是一个原因。如果是,那么我猜在收到响应后该值没有被更新。尝试添加日志并调试每个步骤以深入了解
    • 好的,我发现了错误,在 .env 我不得不将 NODE_ENV 更改为生产而不是开发...所以如果我想部署它到 heroku 我必须将其更改为生产,但我会再次收到此错误!你知道为什么会这样吗??
    • 在本地环境文件中设置生产并测试失败并修复错误的流程。然后它也应该在产品上工作
    • 我创建了 .env.local 并添加了 production 而不是开发,我只是想问一个关于测试的问题...做我创建了一个jest.config.js 用于测试或它是如何工作的...我对测试环境不太熟悉,我还更新了代码,以便您检查...谢谢。
    【解决方案2】:

    在这样的产品后面加问号 => products?.map(...)

    【讨论】:

    • 您好,谢谢您的回复,我按照您的要求做了,但显示语法错误,我什至尝试添加产品?像这样) : products? (,然后是products.map(),但我也得语法错误...我做错了吗?
    • 你用的是哪个版本的 react?
    • 我使用的是 17.0.2 版本,有区别吗?
    猜你喜欢
    • 2022-01-16
    • 2022-12-04
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 2022-01-12
    • 2021-08-02
    • 2021-03-30
    相关资源
    最近更新 更多