💡 D1 数据库 Worker 部署代码:
// Cloudflare Worker 代码 - D1 同步
const CORS_HEADERS = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
};
export default {
async fetch(request, env) {
if (request.method === 'OPTIONS') return new Response(null, {headers: CORS_HEADERS});
const auth = request.headers.get('Authorization');
if (auth !== `Bearer ${env.API_TOKEN}`) return new Response('Unauthorized', {status: 401, headers: CORS_HEADERS});
const url = new URL(request.url);
const path = url.pathname;
// 健康检查
if (path === '/test') return new Response('OK', {headers: CORS_HEADERS});
// 同步接口
if (path === '/sync') {
const deviceId = url.searchParams.get('deviceId');
if (request.method === 'GET') {
if (!deviceId) return new Response('Missing deviceId', {status: 400, headers: CORS_HEADERS});
const row = await env.DB.prepare('SELECT data FROM sync_data WHERE device_id = ?').bind(deviceId).first();
if (!row) return new Response('Not Found', {status: 404, headers: CORS_HEADERS});
return new Response(JSON.stringify({data: JSON.parse(row.data)}), {headers: {...CORS_HEADERS, 'Content-Type': 'application/json'}});
}
if (request.method === 'POST') {
const {deviceId: did, data} = await request.json();
if (!did || !data) return new Response('Missing deviceId/data', {status: 400, headers: CORS_HEADERS});
await env.DB.prepare('INSERT OR REPLACE INTO sync_data (device_id, data, updated_at) VALUES (?, ?, ?)').bind(did, JSON.stringify(data), Date.now()).run();
return new Response('OK', {headers: CORS_HEADERS});
}
}
return new Response('Not Found', {status: 404, headers: CORS_HEADERS});
}
};
D1 数据库初始化 SQL:
CREATE TABLE IF NOT EXISTS sync_data (
device_id TEXT PRIMARY KEY,
data TEXT NOT NULL,
updated_at INTEGER NOT NULL
);
环境变量配置:
•
API_TOKEN: 你的同步密码
•
DB: D1 数据库绑定
• 免费额度:500万行读取/天,10万行写入/天