A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Create, update y delete

13/24
Recursos
// src/products/services/products.service.ts
...

@Injectable()
export class ProductsService {
  ...

  create(data: CreateProductDto) {  // 馃憟
    const newProduct = new this.productModel(data);
    return newProduct.save();
  }

  update(id: string, changes: UpdateProductDto) {  // 馃憟
    const product = this.productModel
      .findByIdAndUpdate(id, { $set: changes }, { new: true })
      .exec();
    if (!product) {
      throw new NotFoundException(`Product #${id} not found`);
    }
    return product;
  }

  remove(id: string) {  // 馃憟
    return this.productModel.findByIdAndDelete(id);
  }
}
// src/products/controllers/products.controller.ts

@Controller('products')
export class ProductsController {
   ...

  @Post()
  create(@Body() payload: CreateProductDto) {
    return this.productsService.create(payload);  // 馃憟
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() payload: UpdateProductDto) {
    return this.productsService.update(id, payload);  // 馃憟
  }

  @Delete(':id')
  delete(@Param('id') id: string) {
    return this.productsService.remove(id);  // 馃憟
  }
}

Revisa que uses el ApiProperty en todos los attrs del Dto para que se haga la actualizaci贸n correctamente.

// src/products/dtos/products.dtos.ts
import { ApiProperty, PartialType } from '@nestjs/swagger';

export class CreateProductDto {
  @IsString()
  @IsNotEmpty()
  @ApiProperty({ description: `product's name` }) // 馃憟 use ApiProperty
  readonly name: string; 

  @IsString()
  @IsNotEmpty()
  @ApiProperty() // 馃憟 use ApiProperty
  readonly description: string;

  @IsNumber()
  @IsNotEmpty()
  @IsPositive()
  @ApiProperty() // 馃憟 use ApiProperty
  readonly price: number;

  @IsNumber()
  @IsNotEmpty()
  @ApiProperty() // 馃憟 use ApiProperty
  readonly stock: number;

  @IsUrl()
  @IsNotEmpty()
  @ApiProperty() // 馃憟 use ApiProperty
  readonly image: string;
}

export class UpdateProductDto extends PartialType(CreateProductDto) {}

Aportes 4

Preguntas 5

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

En este momento, los throw new NotFoundException dejaron de funcionar. Para solucionarlo debemos resolver la promesa que regresa productModel usando async / await por ejemplo.

De otra forma, el modelo siempre retornara algo, retornara 鈥淧romise { <pending> }鈥 sin importar que exista o no el producto en la base de datos.

async findOne(id: string) { 
    const product = await this.productModel.findById(id).exec(); 
    if (!product) {
      throw new NotFoundException(`Product #${id} not found`);
    }
    
    return product;
  }

el metodo para borrar es

findByIdAndRemove

Algo que no te mencionan es agregar todos los servicios de manera as铆ncrona, esto es debido a:

  1. Mayor manejo y respuestas de los servidores.
  2. Manejo de errores en caso de error.
  3. Espera de las consultas a la base de datos y que no colapse.

Espero que ayude el aporte.

No me funcionaba la soluci贸n para cuando no existe el id de un producto, por lo que dise帽e esta soluci贸n espero me comenten que les parece saludos.

En el product.service.

findOne(id: string): Promise<any> {
    return this.productModel
      .findById(id)
      .then((userDB) => {
        if (!userDB) throw new NotFoundException(`Product #${id} not found`);

        return {
          ok: true,
          userDB,
        };
      })
      .catch((err) => {
        throw new NotFoundException(`Product #${id} not found ${err}`);
      });
  }