Búsqueda de sitios web

typescript - Nestjs Subiendo un archivo usando el decorador @UploadedFile: ¿cómo hacer que el parámetro no sea obligatorio?


Con Nest.js, estoy tratando de programar una ruta de creación (Post) para un ingrediente en mi aplicación planificadora de comidas. La ruta recibiría, como cuerpo de la solicitud, una descripción (opcional) y un nombre (obligatorio), así como una imagen opcional. Estoy usando Objection.js como ORM.

Leí la documentación de Nest.js sobre Carga de Archivos, manejo de Archivos en Nest.js con Multer, e intenté hacerlo de la misma manera que en la documentación. El problema es que no puedo encontrar en ningún lado cómo usar el decorador UploadedFile mientras hago que el archivo sea opcional. Recibo el siguiente mensaje de error cuando intento crear un nuevo ingrediente sin una imagen a través de Postman:

{
    "statusCode": 400,
    "message": "File is required",
    "error": "Bad Request"
}

¿Alguien alguna vez se topó con este problema aquí y encontró una solución para hacer que el parámetro fuera opcional? Sé que podría crear una ruta Patch para modificar el ingrediente y agregarle una imagen después como solución temporal, pero me gustaría saber si hay algo que pueda hacer manteniendo el actual.

Este es el código de mi controlador:

@Post()
  @UseInterceptors(
    FileInterceptor('image', {
      storage: diskStorage({
        destination: './assets/images/ingredient',
        filename: getUniqueFileName,
      }),
    }),
  )
  @UseFilters(DeleteFileOnErrorFilter)
  async create(
    @Body() dto: CreateIngredientDto,
    @UploadedFile(
      new ParseFilePipe({
        validators: [new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' })],
      }),
    )
    image?: Express.Multer.File,
  ): Promise<IngredientModel> {
    return this.ingredientService.create(dto, image);
  }

Y el método create llamado desde el Servicio :

async create(
    dto: CreateIngredientDto,
    image?: Express.Multer.File,
  ): Promise<IngredientModel> {
    try {
      return await ImageModel.transaction(async () => {
        if (image) {
          const imagePath = await ImageModel.query().insert({
            location: image.path,
          });
          return this.modelClass
            .query()
            .insert({ ...dto, imageId: imagePath.id });
        }
        return this.modelClass.query().insert({ ...dto });
      });
    } catch (err) {
      this.logger.error('An error occurred while creating the ingredient');
      return null;
    }
  }

Respuesta #1

Puedes pasar fileIsRequired como false a la clase ParseFilePipe.

@UploadedFile(
  new ParseFilePipe({
    validators: [new FileTypeValidator({ fileType: '.(png|jpeg|jpg)' })],
    fileIsRequired: false,
  }),
)