在 TypeScript 中结合 Elysia 和 HTMX 使用复杂参数传递时,有几种主要方式。让我们通过一些实例来详细描述这些方法:
- 使用对象作为参数
在 Elysia 中,你可以定义一个复杂的对象类型作为路由处理函数的参数:
import { Elysia, t } from 'elysia';
const app = new Elysia();
// 定义一个复杂的参数类型
const ComplexParams = t.Object({
name: t.String(),
age: t.Number(),
hobbies: t.Array(t.String()),
address: t.Object({
street: t.String(),
city: t.String(),
country: t.String()
})
});
app.post('/user', ({ body }) => {
// 处理复杂参数
console.log(body);
return `Hello, ${body.name}!`;
}, {
body: ComplexParams
});
app.listen(3000);在 HTMX 中,你可以这样发送请求:
<form hx-post="/user" hx-trigger="submit">
<input type="text" name="name" value="John Doe">
<input type="number" name="age" value="30">
<input type="text" name="hobbies[]" value="reading">
<input type="text" name="hobbies[]" value="coding">
<input type="text" name="address[street]" value="123 Main St">
<input type="text" name="address[city]" value="New York">
<input type="text" name="address[country]" value="USA">
<button type="submit">Submit</button>
</form>- 使用 URL 参数
对于 GET 请求,你可以使用 URL 参数传递复杂数据:
import { Elysia, t } from 'elysia';
const app = new Elysia();
app.get('/user/:id', ({ params, query }) => {
console.log(params.id); // URL路径参数
console.log(query); // URL查询参数
return `User ${params.id}`;
}, {
params: t.Object({
id: t.Number()
}),
query: t.Object({
filter: t.Optional(t.String()),
sort: t.Optional(t.String())
})
});
app.listen(3000);HTMX 请求示例:
<button hx-get="/user/123?filter=active&sort=name" hx-trigger="click">
Get User
</button>- 使用自定义请求头
有时,你可能想通过自定义请求头传递复杂数据:
import { Elysia, t } from 'elysia';
const app = new Elysia();
app.post('/api', ({ headers }) => {
const customData = JSON.parse(headers['x-custom-data'] as string);
console.log(customData);
return 'Processed';
}, {
headers: t.Object({
'x-custom-data': t.String()
})
});
app.listen(3000);HTMX 请求示例:
<button hx-post="/api"
hx-headers='{"x-custom-data": "{\"key\":\"value\",\"array\":[1,2,3]}"}'>
Send Custom Data
</button>- 文件上传
对于文件上传,你可以使用 multipart/form-data:
import { Elysia, t } from 'elysia';
const app = new Elysia();
app.post('/upload', ({ body }) => {
console.log(body.file); // 上传的文件
console.log(body.description); // 其他表单数据
return 'File uploaded';
}, {
body: t.Object({
file: t.File(),
description: t.String()
})
});
app.listen(3000);HTMX 请求示例:
<form hx-post="/upload" hx-encoding="multipart/form-data">
<input type="file" name="file">
<input type="text" name="description">
<button type="submit">Upload</button>
</form>这些例子展示了在 Elysia 和 HTMX 中处理复杂参数的几种常见方法。根据你的具体需求,你可以选择最适合的方式来传递和处理复杂数据。记住,在服务器端要始终验证和清理输入数据,以确保应