翻译:
基于类的控制器和 网络安全网关 页:1
双关,服务于 Bun.serve 有标准
作装饰. 没有 JavaScript 路由器: Bun 内置 routes 处理路径
参数和 HTTP 方法.
HTTP 和 WebSockets 共享一个 listen()一个服务器和一个端口,没有
express, (中文(简体) ), ws 或者说 socket.io。 。 。 .
安装
bun add @dunx/http @dunx/core @dunx/transform
添加 preload = ["@dunx/transform/preload"] 改为 bunfig.toml 用于构造器
注射,一次在顶级,一次在下 [test]。 。 。 .
使用量
import { inject, Module } from '@dunx/core';
import { Controller, Get, HttpFactory, Post, type Input } from '@dunx/http';
import { z } from 'zod'; // or Valibot, or ArkType, or none at all
const createUser = { body: z.object({ name: z.string() }) } as const;
const oneUser = { params: z.object({ id: z.coerce.number() }) } as const;
@Controller('users')
export class UsersController {
readonly #users = inject(UsersService);
@Get('/')
list() {
return this.#users.findAll(); // plain values become Response.json()
}
@Get('/:id', oneUser)
one(input: Input<typeof oneUser>) {
return this.#users.find(input.params.id); // a number, already validated
}
@Post('/', createUser)
create(input: Input<typeof createUser>) {
return this.#users.create(input.body.name); // 201, no Response.json()
}
}
@Module({ controllers: [UsersController], providers: [UsersService] })
export class UsersModule {}
const app = await HttpFactory.create(AppModule);
app.enableShutdownHooks();
await app.listen(3000);
这是什么
每行链接到覆盖它的向导.
| 区域 | 它包含什么 | 指南 |
|---|---|---|
| 主计长和路线 | 单词装饰器、路径参数、前缀、状态代码 | 主计长 |
| 输入 | body, (中文(简体) ), query, (中文(简体) ), params 超过标准Schema | 验证 |
| 中间软件和警卫 | 一个延伸点, @UseGuards, (中文(简体) ), @Roles, (中文(简体) ), @Public | 中间软件和警卫 |
| 网络安全网关 | @Gateway管理者们, PubSub,多节点继电器 | 网络软件 |
| 服务器发送事件 | @Sse, (中文(简体) ), SseStream画作 心跳, Last-Event-ID | 主计长 |
| 请求日志 | 每个请求一个结构化条目,默认情况下 | 日志 |
| 跟踪上下文 | W3C 战车 traceparent 默认通过和宣传 | 日志 |
| 西班牙语 | 每个请求的SERVER间隔和每个呼叫的CLIENT间隔 OtelModule | 追踪 |
| 计量 | 每道计数和计时,默认关闭 | 计量 |
| 卫生和排水 | /health/live, (中文(简体) ), /health/ready准备在推出期间 | 健康检查 |
| 调弦 | @Throttle, (中文(简体) ), @SkipThrottle,内存和 Redis 计数器 | 中间软件和警卫 |
| 境外复原能力 | HttpRetryClassifier: 哪个状态重试,以及 Retry-After | 复原力 |
| 静态文件 | Bun.file 在挂载后带有缓存策略 | 部署 |
| 压缩 | bun自己的压缩机上的克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克特克克特克特克特克特克克特克特克特克特克特克特克克克特克克克特克特克特克特克特克克 | 部署 |
| 难民保护委员会 | 连接和gRPC-Web上的原生软件 | 难民保护委员会 |
子路径
| 子路径 | 包含 |
|---|---|
@dunx/http | 上面的东西 |
@dunx/http/client | 外出的一半: HttpService重试与后退, HttpModule |
@dunx/http/connect | 连接和gRPC-Web上的原生服务,作为中间软件安装 |
@dunx/http/internal | 框架本身的管道。 没有稳定的承诺 |
@dunx/http/internal 用于 dunx 自己的软件包 : @dunx/dashboard, (中文(简体) ), @dunx/mcp
财务报告和审定财务报表 @dunx/openapi。不要从应用程序导入它,因为它可以改变任何
释放.
页:1
- 路线在靴子上找到,包括从基类继承的路线,所以
抽象控制器的子类服务于其父的
@Get方法也一样. - 两个相同方法和路径的处理器在启动时失败, 错误名称 都一样 否则Bun会不说就留着其中一个.
- 处理器可以返回一个
Response,任何JSON可循环值,或undefined一个204. Authorize财务报告和审定财务报表gate()保护管理员页面。 他们收到原始请求 当拒绝访问时回答404,或发送Response你继续往前走, 例如,登录页.@dunx/dashboard财务报告和审定财务报表@dunx/openapi都接受一个, 所以你写了一次访问规则.- Schemas,解析器和状态代码在启动时一出. 处理a 请求中没有元数据查询.
- 每个请求都加入呼叫者的W3C跟踪(
traceparent) (中文(简体) ). 它的日志线携带traceId, (中文(简体) ),spanId, (中文(简体) ),parentSpanId财务报告和审定财务报表traceFlags,而反应包含 (单位:千美元)traceresponse头曰.requestLogging: { trace: false }关掉两个.{ traceResponse: false }保留跟踪字段,只放信头, 它可以保存大约500纳秒的请求。 没有单独的关联 id. metrics: true添加请求数和每个路线的直径图,用于 大约35纳斯请求.@dunx/http/connect为连接和gRPC-Web服务,但不是本地的gRPC. 土著 gRPC将其状态发送到HTTP拖车中Bun.serve无法发送, 所以 请求与content-type: application/grpc得到一个415 解释原因.@connectrpc/connect财务报告和审定财务报表@bufbuild/protobuf是可选的同伴依赖关系, 你留着你自己的.proto工具链.ThrottleGuard适用于 RPC 路径 还有.
许可证
麻省理工学院