Не могу использовать @Res () с FilesInterceptor () - PullRequest
1 голос
/ 11 апреля 2019

Я пытаюсь загрузить файл, используя встроенный мултер, и после этого отправляю ответ обратно пользователю для успеха или неудачи.Все шло хорошо до сегодняшнего дня, пока я не попытаюсь загрузить ответ.после копания я обнаружил, что когда я использую @res с @UploadedFile, он не выполняет контроллер.Я новичок в nest.js.

Работает.

@Post('uploads/avatar')
async uploadFile(@Req() req, @UploadedFile() avatar) {
  console.log(req.body);
  if (!req.body.user_id) {
    throw new Error('id params not found.');
  }
  try {
    const resultUpload = await this.userService.uploadUserImage(
      req.body.user_id,
      avatar, 
    ); // returns the url for the uploaded image
    return resultUpload;
  } catch (error) {
    console.log(error);
    return error;
  }
}

Не Работает.

@Post('uploads/avatar')
async uploadFile(@Req() req, @UploadedFile() avatar, @Res() res) {
  console.log(req.body);
  if (!req.body.user_id) {
    throw new Error('id params not found.');
  }
  try {
    const resultUpload = await this.userService.uploadUserImage(
      req.body.user_id,
      avatar,      
    ); // returns the url for the uploaded image
    return resultUpload;
   res.send(resultUpload);
  } catch (error) {
    console.log(error);
    res.send(error);
  }
}

1 Ответ

1 голос
/ 11 апреля 2019

В гнезде вы всегда должны избегать инъекций @Res, потому что тогда вы потеряете много вещей, которые делают гнездо таким замечательным: перехватчики, фильтры исключений, ...

И на самом деле, в большинстве случаев вы делаете@Res, поскольку nest будет автоматически обрабатывать отправку ответа правильно.

Если вы хотите отправить данные из метода контроллера, вы можете просто вернуть данные (Promises и Observables будут разрешенытакже автоматически).Если вы хотите отправить ошибку клиенту, вы можете просто выбросить соответствующий HttpException, например, 404 -> NotFoundException:

@Post('uploads/avatar')
async uploadFile(@Req() req, @UploadedFile() avatar) {
  if (!req.body.user_id) {
    // throw a 400
    throw new BadRequestException('id params not found.');
  }
  try {
    const resultUpload = await this.userService.uploadUserImage(
      req.body.user_id,
      avatar, 
    );
    return resultUpload;
  } catch (error) {
    if (error.code === 'image_already_exists') {
      // throw a 409
      throw new ConflictException('image has already been uploaded');
    } else {
      // throw a 500
      throw new InternalServerException();
    }
  }
}

Если по какой-то причине вам необходимо ввести @Res здесь, вы не можете использовать FilesInterceptor.Затем вам нужно самостоятельно настроить промежуточное программное обеспечение multer.


Примечание

Вы можете создать собственный декоратор для доступа к userId:

import { createParamDecorator } from '@nestjs/common';

export const UserId = createParamDecorator((data, req) => {
  if (!req.body || !req.body.user_id) {
    throw new BadRequestException('No user id given.')
  }
  return req.body.user_id;
});

и затем используйте его в вашем методе контроллера следующим образом:

@Post('uploads/avatar')
async uploadFile(@UserId() userId, @UploadedFile() avatar) {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...