gpt4 book ai didi

javascript - 不能将 @Res() 与 FilesInterceptor() 一起使用

转载 作者:行者123 更新时间:2023-11-30 19:38:53 25 4
gpt4 key购买 nike

我正在尝试使用内置 multer 上传文件,然后将响应发送回用户以判断成功或失败。一切都很顺利,直到今天,当我尝试上传时,响应不会到来。经过一番挖掘后,我发现当我将@res 与@UploadedFile 一起使用时,它不会执行 Controller 。我是 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);
}
}

最佳答案

在 nest 中,您应该始终避免注入(inject) @Res,因为那样您会失去很多让 nest 如此出色的东西:拦截器、异常过滤器……

实际上,在大多数情况下您不需要 @Res,因为 nest 会自动处理正确发送响应。

如果你想从 Controller 方法发送数据,你可以只返回数据(PromisesObservables 也会自动解析)。如果你想向客户端发送错误,你可以抛出相应的 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();
}
}
}

如果出于某种原因您必须在此处注入(inject)@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;
});

然后像这样在你的 Controller 方法中使用它:

@Post('uploads/avatar')
async uploadFile(@UserId() userId, @UploadedFile() avatar) {

关于javascript - 不能将 @Res() 与 FilesInterceptor() 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55626582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com