[ PROMPT_NODE_24304 ]
Smart Placement 设计模式
[ SKILL_DOCUMENTATION ]
# 智能放置(Smart Placement)模式
## 带有数据库访问的后端 Worker
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const user = await env.DATABASE.prepare('SELECT * FROM users WHERE id = ?').bind(userId).first();
const orders = await env.DATABASE.prepare('SELECT * FROM orders WHERE user_id = ?').bind(userId).all();
return Response.json({ user, orders });
}
};
c
{ "placement": { "mode": "smart" }, "d1_databases": [{ "binding": "DATABASE", "database_id": "xxx" }] }
## 前端 + 后端分离(服务绑定)
**前端:** 在边缘运行以实现快速用户响应
**后端:** 智能放置在靠近数据库的位置运行
typescript
// 前端 Worker - 将请求路由到后端
interface Env {
BACKEND: Fetcher; // 指向后端 Worker 的服务绑定
}
export default {
async fetch(request: Request, env: Env): Promise {
if (new URL(request.url).pathname.startsWith('/api/')) {
return env.BACKEND.fetch(request); // 转发给后端
}
return new Response('前端内容');
}
};
// 后端 Worker - 数据库操作
interface BackendEnv {
DATABASE: D1Database;
}
export default {
async fetch(request: Request, env: BackendEnv): Promise {
const data = await env.DATABASE.prepare('SELECT * FROM table').all();
return Response.json(data);
}
};
**关键点:** 使用基于 `fetch` 的服务绑定(如上所示)。如果使用带有 `WorkerEntrypoint` 的 RPC,智能放置将不会优化这些方法调用——仅 `fetch` 处理程序受影响。
**RPC 与 Fetch 的对比 - 关键点:** 智能放置仅适用于基于 `fetch` 的绑定,不适用于 RPC。
typescript
// ❌ RPC - 智能放置对后端 RPC 方法无效
export class BackendRPC extends WorkerEntrypoint {
async getData() {
// 始终在边缘运行,忽略智能放置
return await this.env.DATABASE.prepare('SELECT * FROM table').all();
}
}
// ✅ Fetch - 智能放置生效
export default {
async fetch(request: Request, env: Env): Promise {
// 启用智能放置后,在靠近 DATABASE 的位置运行
const data = await env.DATABASE.prepare('SELECT * FROM table').all();
return Response.json(data);
}
};
## 外部 API 集成
typescript
export default {
async fetch(request: Request, env: Env): Promise {
const apiUrl = 'https://api.partner.com';
const headers = { 'Authorization': `Bearer ${env.API_KEY}` };
con