Skip to content
npm version

vtzacvite + nestjs

新一代的全栈解决方案

端到端示例
NestJS 后端与前端调用示例,端到端类型安全。
typescript
@Controller('api/user')
export class UserController {
  @Post(':id/upload')
  async uploadAvatar(
    @Param('id') userId: string,
    @Query('version') version: string,
    @UploadedFile() file: Express.Multer.File,
    @Body() metadata: { title: string }
  ) {
    return {
      success: true,
      userId,
      version,
      filename: file.filename,
      metadata,
    };
  }
}
tsx
import { _http } from 'vtzac';
import { UserController } from './backend/user.controller';

const api = _http({
  ofetchOptions: {
    baseURL: 'http://localhost:3000',
  },
}).controller(UserController);

function UploadComponent() {
  const handleUpload = async (event: React.ChangeEvent<HTMLInputElement>) => {
    const file = event.target.files?.[0]; // File 类型
    if (!file) return;

    // 类型安全调用
    // 实际请求: POST /api/user/123/upload?version=v2
    const result = await api.uploadAvatar(
      '123', // @Param('id')
      'v2', // @Query('version')
      file as unknown as Express.Multer.File, // @UploadedFile()
      { title: '头像' } // @Body()
    );

    console.log(result._data);
    // 打印出: { success: true, userId: '123', version: 'v2', filename: 'avatar.jpg', metadata: { title: '头像' } }
  };

  return <input type="file" onChange={handleUpload} />;
}