首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用所需格式的路由控制器使用自定义消息抛出错误

使用所需格式的路由控制器使用自定义消息抛出错误
EN

Stack Overflow用户
提问于 2022-04-11 19:06:43
回答 1查看 458关注 0票数 0

我有一个使用路由控制器的Node应用程序,在Readme中有一个名为抛出HTTP错误的部分,其中示例是不言自明的。

但问题是当我试图复制这些线条的时候。在我的代码中,我有一个示例(为了测试目的,我想抛出异常而不做任何事情):

代码语言:javascript
复制
@Post('/')
async post(): Promise<any> {
    throw new NotFoundError(`User was not found.`);
}

其中NotFoundError是从routing-controllers导入的。这个应该管用但是..。它返回整个错误跟踪,而不是像下面这样的对象

代码语言:javascript
复制
{
  "name": "NotFoundError",
  "message": "User was not found."
}

状态为404,但返回的文本为:

代码语言:javascript
复制
Error
    at new HttpError (/path_to_the_code/node_modules/src/http-error/HttpError.ts:16:18)
    at new NotFoundError (/path_to_the_code/node_modules/src/http-error/NotFoundError.ts:10:5)
    at HelloWorld.<anonymous> (/path_to_the_code/src/controller/controllers/HelloWorldController.ts:20:15)
    at Generator.next (<anonymous>)
    at /path_to_the_code/src/controller/controllers/HelloWorldController.ts:17:71
    at new Promise (<anonymous>)
    at __awaiter (/path_to_the_code/src/controller/controllers/HelloWorldController.ts:13:12)
    at HelloWorld.post (/path_to_the_code/src/controller/controllers/HelloWorldController.ts:36:16)
    at ActionMetadata.callMethod (/path_to_the_code/node_modules/src/metadata/ActionMetadata.ts:252:44)
    at /path_to_the_code/node_modules/src/RoutingControllers.ts:123:28

我正在尝试调试,13:12是另一条路线:

代码语言:javascript
复制
@Get('/')
async get(): Promise<any> {
    return this.helloWorldService.getHello()
}

顺便说一句,整个控制器是这样的:

代码语言:javascript
复制
import { Controller, Get, NotFoundError, Post } from 'routing-controllers';
import { Service } from 'typedi';
import { HelloWorldService } from '../../business/services/HelloWorldService';

@Service()
@Controller('/hello-world')
export class HelloWorld {

    constructor(public helloWorldService: HelloWorldService) { }

    @Get('/')
    async get(): Promise<any> {
        return this.helloWorldService.getHello()
    }

    @Post('/')
    async post(): Promise<any> {
        throw new NotFoundError(`User was not found.`);
    }
}

所以我不想知道这个错误是从哪里来的。

我想要的是从服务器接收与docs:{name:'', message:''}相同的结构,而不是整个堆栈跟踪。

顺便说一句,这似乎是一个内部错误,甚至HTTP代码也能正常工作。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 22:03:43

我在使用Express和路由控制器方面非常新,所以我不确定这是否是最好的方法。我通过添加一个自定义错误处理程序作为中间件来实现它:

代码语言:javascript
复制
import { Middleware, ExpressErrorMiddlewareInterface, HttpError } from 'routing-controllers';

@Middleware({ type: 'after' })
export class HttpErrorHandler implements ExpressErrorMiddlewareInterface {
    error(error: any, request: any, response: any, next: (err: any) => any) {
        if (error instanceof HttpError) {
            response.status(error.httpCode).json(error);
        }

        next(error);
    }
}

注意,我使用error.httpCode设置状态,然后将error转换为JSON。之后,我将错误处理程序添加到middlewares数组中,并将defaultErrorHandler设置为false

代码语言:javascript
复制
const app = createExpressServer({
    defaultErrorHandler: false,
    middlewares: [
        HttpErrorHandler
    ],
    // ...
});

我现在得到这样的响应(以及相应的响应状态代码):

代码语言:javascript
复制
{
   httpCode: 404,
   name: "NotFoundError",
   message: "User was not found",
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71833056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档