在 TypeScript 中结合 Elysia 和 HTMX 使用复杂参数传递时,有几种主要方式。让我们通过一些实例来详细描述这些方法:

  1. 使用对象作为参数

在 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>
  1. 使用 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>
  1. 使用自定义请求头

有时,你可能想通过自定义请求头传递复杂数据:

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>
  1. 文件上传

对于文件上传,你可以使用 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 中处理复杂参数的几种常见方法。根据你的具体需求,你可以选择最适合的方式来传递和处理复杂数据。记住,在服务器端要始终验证和清理输入数据,以确保应