#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, кажется, там все в порядке. Кроме того, я также опубликую свой пост.