Asena Hono适配器
基于Hono web框架的Asena.js的HTTP和WebSocket适配器实现。
功能
- 快速和现代的API端点 Hono web框架
- 高性能与Bun运行时
- TypeScript的完整类型支持
- HTTP和WebSocket适配器支持
- 易于集成和使用
- Zod的验证支持
- 基于控制器的路由的装饰器
请求管道顺序:全局中间件→路由中间件→验证器→处理程序。
要求
- 包子 V1.4或更高版本
- @asenajs / asena V0.12.0或更高版本(对等依赖)
- Hono V4.12.9或更高版本(对等依赖)
- 萨德 V4.3.6或更高版本(对等依赖)
- TypeScript v5.8.2或更高版本
安装
bun add @asenajs/hono-adapter hono zod
hono 和 zod 是 同行依赖性 -此适配器提供包装器,您的项目拥有
它包装的库。这就是将您的代码和适配器保存在单个副本上的原因 hono;两个
拷贝意味着两个 HTTPException 类,并且从错误的类抛出一个故意的403得到回答
500.
| 包管理器 | 命令 |
|---|---|
| Bun, NPM 7+, PNPM 8+ | bun add hono zod -对等体自动安装,但无论如何声明它们,以便它们在干净安装中存活 |
| 纱1 | yarn add hono zod - - - - - - 要求, yarn 1不为您安装peers |
使用
服务器设置(index.ts)
import { AsenaServer } from '@asenajs/asena';
import { DefaultLogger } from "@asenajs/asena/logger";
import { createHonoAdapter } from '@asenajs/hono-adapter';
const [adapter, logger] = createHonoAdapter(new DefaultLogger());
await new AsenaServer(adapter)
.logger(logger)
.port(3000)
.start(true);
控制器的例子
import { Controller } from '@asenajs/asena/decorators';
import { Get } from '@asenajs/asena/decorators/http';
import type { Context } from '@asenajs/hono-adapter';
@Controller()
export class TestController {
@Get("/")
public async me(context: Context) {
return context.send("Hello World!");
}
}
API文档
createHonoAdapter(记录器、期权)
用于创建Hono适配器的辅助函数。
参数:
logger(Logger):来自Asena的Logger实例
返回:
- 带有[adapter, logger]的元组
测试
Asena Hono适配器使用Bun的内置测试框架进行单元和集成测试。
运行测试
# Run all tests
bun test
# Run tests with watch mode
bun test:watch
# Run tests with coverage report
bun test:coverage
测试结构
-
单元测试:单独测试各个组件
HonoAdapter.test.ts-测试HTTP适配器HonoContextWrapper.test.ts-测试上下文包装器HonoWebsocketAdapter.test.ts-测试WebSocket适配器
-
集成测试:测试组件如何协同工作
integration.test.ts-适配器的端到端测试
编写测试
测试控制器的示例:
import { describe, expect, it } from "bun:test";
import { AsenaServer } from "@asenajs/asena";
import { createHonoAdapter } from "@asenajs/hono-adapter";
import { DefaultLogger } from "@asenajs/asena/logger";
import { YourController } from "../path/to/your/controller";
describe("YourController", () => {
let server;
let baseUrl;
beforeEach(async () => {
// 10000-31999: below the kernel's ephemeral floor (net.ipv4.ip_local_port_range,
// 32768-60999). A server port drawn from that range collides with the outbound
// sockets the suite itself holds open - TIME_WAIT included - and Bun.serve then
// fails with EADDRINUSE, randomly, in whichever test happened to draw it.
const port = 10000 + Math.floor(Math.random() * 22000);
const [adapter, logger] = createHonoAdapter(new DefaultLogger());
const app = new AsenaServer(adapter).logger(logger).port(port);
app.register(YourController);
server = await app.start();
baseUrl = `http://localhost:${port}`;
});
afterEach(() => {
server.stop();
});
it("should respond correctly", async () => {
const response = await fetch(`${baseUrl}/your-endpoint`);
const data = await response.json();
expect(response.status).toBe(200);
expect(data).toEqual({ /* expected response */ });
});
});
开发
以开发模式运行项目:
bun run build
许可证
本项目使用麻省理工学院许可协议。看到 许可证 文件查看详细信息。