NodeJS 需要路径'comment',MERN堆栈

ippsafx7  于 2022-12-22  发布在  Node.js
关注(0)|答案(1)|浏览(149)

我不明白为什么会出现此错误。这是我的控制器:

export const createProductReview = async (req, res) => {
  const { rating, comment } = req.body;

  const product = await Product.findById(req.params.id);

  if (product) {
    const alreadyReviewed = product.reviews.find(
      r => r.user.toString() === req.user.userId.toString()
    );
    if (alreadyReviewed) {
      throw new NotFoundError('Product already reviewed');
    }
    const review = {
      user: req.user.userId,
      name: req.user.username,
      rating: Number(rating),
      comment,
    };

    product.reviews.push(review);

    product.numOfReviews = product.reviews.length;

    product.rating =
      product.reviews.reduce((acc, item) => item.rating + acc, 0) /
      product.reviews.length;

    await product.save();
    res.status(StatusCodes.OK).json({ message: 'Review added', review });
  } else {
    throw new NotFoundError('Product not found');
  }
};

这是我的productPage,我在其中分派addProductReview并从params和review对象传递产品ID:

const [rating, setRating] = useState(0);
  const [comment, setComment] = useState('');

  const submitHandler = e => {
    e.preventDefault();
    dispatch(
      addProductReview(id, {
        rating,
        comment,
      })
    );
  };

这是我的产品切片:

export const addProductReview = createAsyncThunk(
  'product/review',
  async (id, { review }, thunkAPI) => {
    try {
      const { data } = await axios.post(
        `/api/v1/products/${id}/reviews`,
        review
      );
      return data;
    } catch (error) {
      const message = error.response.data.msg;
      return thunkAPI.rejectWithValue(message);
    }
  }
);

我不知道为什么我得到了错误路径注解是必需的。我通过审查对象的路线。

vlju58qv

vlju58qv1#

问题出在Thunk payloadCreator中使用的参数。从the documentation ...
将使用两个参数调用payloadCreator函数:

  • arg:单个值,包含在调度thunk操作创建者时传递给该创建者的第一个参数。这对于传递请求中可能需要的项ID等值非常有用。如果需要传递多个值,请在调度thunk时将它们一起传递到一个对象中,如dispatch(fetchUsers({status: 'active', sortBy: 'name'}))
  • thunkAPI:包含通常传递给Redux thunk函数的所有参数以及附加选项的对象

您的payloadCreator有三个参数,这是不正确的。
试试这个

export const addProductReview = createAsyncThunk(
  'product/review',
  async ({ id, ...review }, thunkAPI) => {
    try {
      const { data } = await axios.post(
        `/api/v1/products/${id}/reviews`,
        review
      );
      return data;
    } catch (error) {
      const message = error.response.data.msg;
      return thunkAPI.rejectWithValue(message);
    }
  }
);

像这样发送

dispatch(addProductReview({ id, rating, comment }));

相关问题