В гнезде вы всегда должны избегать инъекций @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) {