Node.js , Мангуст: Как добавить товар в корзину?

#node.js #mongodb #express #mongoose

#node.js #mongodb #экспресс #мангуст

Вопрос:

Я пытаюсь добавить товар в корзину пользователя и застрял на некоторое время.
Моя проблема в том, что, когда я пытаюсь протестировать его через Postman, он выдает ошибку 400 из catch и другую ошибку в консоли

  Error: Product undefined not found
[TypeScript]     at /home/src/services/User.ts:22:11
[TypeScript]     at Generator.next (<anonymous>)
[TypeScript]     at fulfilled (/home/src/services/User.ts:5:58)
 

В функции Services / AddToCart я получаю товар по идентификатору с помощью метода Mongoose findById

   const product = await Product.findById(productId).exec()
    if (!product) {
      throw new Error(`Product ${productId} not found`)
    }
 

И отсюда возникает ошибка.
Также я пробовал использовать метод PUT, но тоже не сработал.
И, честно говоря, я не совсем уверен, правильный ли это подход. Может быть, мне нужно иметь корзину в модели продукта.
Любая помощь будет оценена.
Вот код:
Модель пользователя:

 import mongoose, { Document, Schema } from 'mongoose'
import Product, { ProductDocument } from './Product'

export type cart = {
  product: string
  quantity: number
}

export type UserDocument = Document amp; {
  email: string
  password: string
  cart: cart[]
}

const UserSchema = new mongoose.Schema({
  email: {
    type: String,
  },
  password: {
    type: String,
  },
  cart: [
    {
      product: {
        type: Schema.Types.ObjectId,
        ref: 'Product',
      },
      quantity: Number,
    },
  ],
})

export default mongoose.model<UserDocument>('User', UserSchema)

 

Услуги:

 const addProductToCart = async (
    userId: string,
    productId: string
  ): Promise<UserDocument> => {
    const user = await User.findById(userId).select('-password').exec()
    if (!user) {
      throw new Error(`User ${userId} not found`)
    }
    const product = await Product.findById(productId).exec()
    if (!product) {
      throw new Error(`Product ${productId} not found`)
    }
    const itemAdded = user.cart.find((item) => item.product == productId)
    if (itemAdded) {
      const itemAddedIndex = user.cart.find(
        (item) => item.product === product._id
      )
      itemAdded.quantity  = 1
       user.cart[itemAddedIndex] = itemAdded
    }
    if (!itemAdded) {
      user.cart.push({ product: productId/* , quantity: 1  */})
    }
    return user.save()
  }

export default{createNewUser, getAllUsers, addProductToCart}
 

Контроллеры:

 //Patch/inCart/:userid//
export const addProductToCart = async (
  req: Request,
  res: Response,
  next: NextFunction
) => {
  try {
    const { productId } = req.body
    const userId = req.params.userId
    const updatedUser = await UserService.addProductToCart(userId, productId)
    res.json(updatedUser)
  } catch (error) {
    console.log(error)
    next(new BadRequestError('Something went wrong', error))
  }
}
 

Маршрутизаторы:

 import express from 'express'
import {createUser, getUsers, addProductToCart} from '../controllers/User'

const router = express.Router()

router.post('/', createUser)
router.get('/', getUsers)
router.patch('/inCart/:userId', addProductToCart)

export default router
 

Предполагая, что я делаю что-то неправильно во время тестирования, смотрите скриншоты из Postman testing
введите описание изображения здесь

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

Ответ №1:

проверьте заголовок запроса, вы должны установить content-type = application/json и content-lenght = <calculated when request is sent> понравиться следующая фотография введите описание изображения здесь

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

1. Привет @Mohammad Yaser Ahmadi спасибо за ответ. Я проверил свои настройки Postman, кажется, там все в порядке. Кроме того, я также опубликую свой пост.