作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用内置 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 方法发送数据,你可以只返回数据(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();
}
}
}
如果出于某种原因您必须在此处注入(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/
我正在尝试使用内置 multer 上传文件,然后将响应发送回用户以判断成功或失败。一切都很顺利,直到今天,当我尝试上传时,响应不会到来。经过一番挖掘后,我发现当我将@res 与@UploadedFil
我是一名优秀的程序员,十分优秀!