繁体   English   中英

如何从回调返回 json 消息而不是触发错误 | NestJs 文件上传

[英]How to return json message from callback instead of triggering error | NestJs File upload

我正在处理 Nestjs Multer 文件上传,我为 FileInterceptor 创建了一个文件过滤器,我想发回响应而不是发送错误,我必须发送一个带有“不支持文件类型”消息的 JSON。

export const FileFilter = (req, file, callback) => {
 if (!file.originalname.match(/\.(jpg|jpeg|png)$/)) {
   return callback(new Error('Only image files supported!'), false);
 }
 callback(null, true);
}

而不是发送新的错误(),我想发送

res.send({status:"error",message:"File types does not supported"});

此操作由内置的全局异常过滤器执行,该过滤器处理 HttpException 类型的异常(及其子类)。 当无法识别异常(既不是 HttpException 也不是继承自 HttpException 的类)时,内置异常过滤器会生成以下默认 JSON 响应:

{
  "statusCode": 500,
  "message": "Internal server error"
}

在许多情况下,您不需要编写自定义异常,并且可以使用内置的 Nest HTTP 异常,如下一节所述。 如果确实需要创建自定义异常,最好创建自己的异常层次结构,其中自定义异常继承自 HttpException 基类。 通过这种方法,Nest 将识别您的异常,并自动处理错误响应。 让我们实现这样一个自定义异常:

import { ExceptionFilter, Catch, HttpException, ArgumentsHost, HttpStatus, BadRequestException } from '@nestjs/common';

@Catch()
export class ErrorFilter implements ExceptionFilter {
  catch(error: Error, host: ArgumentsHost) {
    let response = host.switchToHttp().getResponse();
    let status = (error instanceof HttpException) ? error.message: HttpStatus.INTERNAL_SERVER_ERROR;
    if (status.statusCode === HttpStatus.BAD_REQUEST) {
        return response.status(HttpStatus.BAD_REQUEST).send(status)
    }

    if (status.statusCode === HttpStatus.NOT_FOUND) {
        return response.status(HttpStatus.NOT_FOUND).send(status)
    }
 
    if (status.statusCode === HttpStatus.UNAUTHORIZED) 
        return response.status(status.statusCode).send(status)

        
    if (status.statusCode === HttpStatus.NOT_FOUND) 
        return response.status(status).send(status)
    if (status === HttpStatus.INTERNAL_SERVER_ERROR) {
        if (process.env.NODE_ENV === 'production') {
          console.error(error.stack);
          return response.status(status).render('views/500');
        }
        else {
          let message = error.stack;
          return response.status(status).send(message); 
        } 
    }

  }
}

有关更多详细信息,您可以查看Nest.js文档自定义异常过滤器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM