encore-api
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseEncore API Endpoints
Encore API 端点
Instructions
操作步骤
When creating API endpoints with Encore.ts, follow these patterns:
使用Encore.ts创建API端点时,请遵循以下模式:
1. Import the API module
1. 导入API模块
typescript
import { api } from "encore.dev/api";typescript
import { api } from "encore.dev/api";2. Define typed request/response interfaces
2. 定义类型化的请求/响应接口
Always define explicit TypeScript interfaces for request and response types:
typescript
interface CreateUserRequest {
email: string;
name: string;
}
interface CreateUserResponse {
id: string;
email: string;
name: string;
}始终为请求和响应类型定义明确的TypeScript接口:
typescript
interface CreateUserRequest {
email: string;
name: string;
}
interface CreateUserResponse {
id: string;
email: string;
name: string;
}3. Create the endpoint
3. 创建端点
typescript
export const createUser = api(
{ method: "POST", path: "/users", expose: true },
async (req: CreateUserRequest): Promise<CreateUserResponse> => {
// Implementation
}
);typescript
export const createUser = api(
{ method: "POST", path: "/users", expose: true },
async (req: CreateUserRequest): Promise<CreateUserResponse> => {
// 实现逻辑
}
);API Options
API 选项
| Option | Type | Description |
|---|---|---|
| string | HTTP method: GET, POST, PUT, PATCH, DELETE |
| string | URL path, supports |
| boolean | If true, accessible from outside (default: false) |
| boolean | If true, requires authentication |
| 选项 | 类型 | 描述 |
|---|---|---|
| string | HTTP方法:GET、POST、PUT、PATCH、DELETE |
| string | URL路径,支持 |
| boolean | 如果为true,则对外可访问(默认值:false) |
| boolean | 如果为true,则需要身份验证 |
Parameter Types
参数类型
Path Parameters
路径参数
typescript
// Path: "/users/:id"
interface GetUserRequest {
id: string; // Automatically mapped from :id
}typescript
// 路径: "/users/:id"
interface GetUserRequest {
id: string; // 自动从:id映射
}Query Parameters
查询参数
typescript
import { Query } from "encore.dev/api";
interface ListUsersRequest {
limit?: Query<number>;
offset?: Query<number>;
}typescript
import { Query } from "encore.dev/api";
interface ListUsersRequest {
limit?: Query<number>;
offset?: Query<number>;
}Headers
请求头
typescript
import { Header } from "encore.dev/api";
interface WebhookRequest {
signature: Header<"X-Webhook-Signature">;
payload: string;
}typescript
import { Header } from "encore.dev/api";
interface WebhookRequest {
signature: Header<"X-Webhook-Signature">;
payload: string;
}Request Validation
请求验证
Encore validates requests at runtime using TypeScript types. Add constraints for stricter validation:
typescript
import { api, Min, Max, MinLen, MaxLen, IsEmail, IsURL } from "encore.dev/api";
interface CreateUserRequest {
email: string & IsEmail; // Must be valid email
username: string & MinLen<3> & MaxLen<20>; // 3-20 characters
age: number & Min<13> & Max<120>; // Between 13 and 120
website?: string & IsURL; // Optional, must be URL if provided
}Encore会使用TypeScript类型在运行时验证请求。添加约束以实现更严格的验证:
typescript
import { api, Min, Max, MinLen, MaxLen, IsEmail, IsURL } from "encore.dev/api";
interface CreateUserRequest {
email: string & IsEmail; // 必须是有效的邮箱
username: string & MinLen<3> & MaxLen<20>; // 3-20个字符
age: number & Min<13> & Max<120>; // 13到120之间
website?: string & IsURL; // 可选,若提供则必须是URL
}Available Validators
可用验证器
| Validator | Applies To | Example |
|---|---|---|
| number | |
| number | |
| string, array | |
| string, array | |
| string | |
| string | |
| 验证器 | 适用类型 | 示例 |
|---|---|---|
| number | |
| number | |
| string, array | |
| string, array | |
| string | |
| string | |
Validation Error Response
验证错误响应
Invalid requests return 400 with details:
json
{
"code": "invalid_argument",
"message": "validation failed",
"details": { "field": "email", "error": "must be a valid email" }
}无效请求会返回400状态码及详细信息:
json
{
"code": "invalid_argument",
"message": "validation failed",
"details": { "field": "email", "error": "must be a valid email" }
}Raw Endpoints
原始端点
Use for webhooks or when you need direct request/response access:
api.rawtypescript
export const stripeWebhook = api.raw(
{ expose: true, path: "/webhooks/stripe", method: "POST" },
async (req, res) => {
const sig = req.headers["stripe-signature"];
// Handle raw request...
res.writeHead(200);
res.end();
}
);对于Webhook或需要直接访问请求/响应的场景,使用:
api.rawtypescript
export const stripeWebhook = api.raw(
{ expose: true, path: "/webhooks/stripe", method: "POST" },
async (req, res) => {
const sig = req.headers["stripe-signature"];
// 处理原始请求...
res.writeHead(200);
res.end();
}
);Error Handling
错误处理
Use for proper HTTP error responses:
APIErrortypescript
import { APIError, ErrCode } from "encore.dev/api";
// Throw with error code
throw new APIError(ErrCode.NotFound, "user not found");
// Or use shorthand
throw APIError.notFound("user not found");
throw APIError.invalidArgument("email is required");
throw APIError.unauthenticated("invalid token");使用返回正确的HTTP错误响应:
APIErrortypescript
import { APIError, ErrCode } from "encore.dev/api";
// 抛出带错误码的异常
throw new APIError(ErrCode.NotFound, "user not found");
// 或使用简写形式
throw APIError.notFound("user not found");
throw APIError.invalidArgument("email is required");
throw APIError.unauthenticated("invalid token");Common Error Codes
常见错误码
| Code | HTTP Status | Usage |
|---|---|---|
| 404 | Resource doesn't exist |
| 400 | Bad input |
| 401 | Missing/invalid auth |
| 403 | Not allowed |
| 409 | Duplicate resource |
| 错误码 | HTTP状态码 | 用途 |
|---|---|---|
| 404 | 资源不存在 |
| 400 | 输入参数错误 |
| 401 | 缺失/无效的身份验证 |
| 403 | 无权限访问 |
| 409 | 资源重复 |
Static Assets
静态资源
Serve static files (HTML, CSS, JS, images) with :
api.statictypescript
import { api } from "encore.dev/api";
// Serve files from ./assets under /static/*
export const assets = api.static(
{ expose: true, path: "/static/*path", dir: "./assets" }
);
// Serve at root (use !path for fallback routing)
export const frontend = api.static(
{ expose: true, path: "/!path", dir: "./dist" }
);
// Custom 404 page
export const app = api.static(
{ expose: true, path: "/!path", dir: "./public", notFound: "./404.html" }
);使用提供静态文件(HTML、CSS、JS、图片):
api.statictypescript
import { api } from "encore.dev/api";
// 提供./assets目录下的文件,路径为/static/*
export const assets = api.static(
{ expose: true, path: "/static/*path", dir: "./assets" }
);
// 在根路径提供(使用!path作为回退路由)
export const frontend = api.static(
{ expose: true, path: "/!path", dir: "./dist" }
);
// 自定义404页面
export const app = api.static(
{ expose: true, path: "/!path", dir: "./public", notFound: "./404.html" }
);Guidelines
规范
- Always use not
importrequire - Define explicit interfaces for type safety
- Use only for public endpoints
expose: true - Use for webhooks,
api.rawfor everything elseapi - Throw instead of returning error objects
APIError - Path parameters are automatically extracted from the path pattern
- Use validation constraints (,
Min, etc.) for user inputMaxLen
- 始终使用而非
importrequire - 定义明确的接口以确保类型安全
- 仅对公开端点使用
expose: true - Webhook使用,其他场景使用
api.rawapi - 抛出而非返回错误对象
APIError - 路径参数会自动从路径模式中提取
- 对用户输入使用验证约束(、
Min等)MaxLen