@ api-ts/ typed- sext- 路由器
绕着快递的一圈 Router
目标
- 定义与 api- ts 中的路线相关的快递路线
apiSpec - 以已解码的请求对象和 api- ts 路由增强现有的 Express 请求 元数据
- 通过打字检查增强已有的快递响应
encode函数 - 允许定制解码/编码出错的操作, 如果需要, 则按程序进行
- 允许在发送编码后的响应后( 如果需要) 按程序执行动作
- 允许路由定义路径不同于指定路径的别名
输入
httpRoute - 尽可能跟紧快速路由器 api 否则
非目标
- 强制执行其中列出的所有路线
apiSpec拥有相关的路由处理器 - 上面的图层
express.RequestHandler[]额外的链条 描述的属性Goals(项目和其他图书馆可以做到这一点)
使用量
创建路由器
这个库提供了两个非常相近的功能,它们分别创建或包装 快速路由器 :
import { createRouter, wrapRouter } from '@api-ts/typed-express-router';
import express from 'express';
import { MyApi } from 'my-api-package';
const app = express();
const typedRouter = createRouter(MyApi);
app.use(typedRouter);
添加路径
一旦你拥有 typedRouter,您可以通过 api-ts api 名称开始添加路由 :
typedRouter.get('hello.world', [HelloWorldHandler]);
这里, HelloWorldHandler 几乎像一个快递请求处理器,但 req 财务报告和审定财务报表
res 拥有额外的财产. req.decoded 包含已验证和已解码的请求.
在反应方面,有一个额外的 res.sendEncoded(status, payload) 函数
将在有效载荷上适当执行类型和编码类型(例如:.
BigIntFromString 将转换为字符串。 导出 TypedRequestHandler
类型可以用来推断这些函数的参数类型.
路由别名
如果在路径路径中需要更大的灵活性,a routeAliases 函数可能是
以匹配多个路径。 这些路径可能使用匹配语法的完整快报,
但要注意保存任何路径参数 否则你可能会被解码出错.
typedRouter.get('hello.world', [HelloWorldHandler], {
routeAliases: ['/oldDeprecatedHelloWorld'],
});
钩子和错误处理器
这个 createRouter, (中文(简体) ), wrapRouter,而单个路由方法都采用可选的最后一个
参数,其中可以提供响应后和错误处理功能。 一个
为特定路由指定,优先于顶级。 这些可能是
用于自定义错误响应并进行其他动作,如度量衡集合或
伐木业.
const typedRouter = createRouter(MyApi, {
decodeErrorFormatter: (errs, req) => {
// Format `errs` however you want
return { message: 'Bad request' };
},
getDecodeErrorStatusCode: (errs, req) => {
return 400;
},
encodeErrorFormatter: (err, req) => {
return { message: 'Internal server error' };
},
getEncodeErrorStatusCode: (err, req) => {
// Ideally won't happen unless type safety is violated, so it's a 500
return 500;
},
afterEncodedResponseSent: (status, payload, req, res) => {
// Perform side effects or other things, `res` should be ended by this point
endRequestMetricsCollection(req);
},
});
// Override the decode error handler on one route
typedRouter.get('hello.world', [HelloWorldHandler], {
decodeErrorFormatter: customHelloDecodeErrorFormatter,
});
未检查路线
如果您需要解码错误的自定义行为, 则不只是发送一个
出错响应,然后可以使用路由器函数的不受控制的变体. 没错
不失败, 并使用 http 响应发送 decodeErrorFormatter 财务报告和审定财务报表
getDecodeErrorStatusCode 当请求无效时。 相反,他们仍然会大量使用
req.decoded除了这次,它会包含 Either<Errors, DecodedRequest> 类型
供路由处理人员检查.
// Just a normal express route
typedRouter.getUnchecked('hello.world', (req, res) => {
if (E.isLeft(req.decoded)) {
console.warn('Route failed to decode! Continuing anyway');
})
res.send(200).end();
});
路由器中间软件
中间软件添加到 typedRouter.use() 在请求解码后运行
在验证之前,甚至在检查过的路线上。 它可以进入 req.decoded 内
和无节制的路线一样.
其他用途
除了上面记载的以外 包裹的路由器应该像普通的
一号快递,所以.. typedRouter.use() 应该有同样的行为.