Supabase Edge Function
이 콘텐츠는 아직 번역되지 않았습니다.
Ключ AstroWay не можна класти у фронтенд: усе, що потрапило в бандл, бачить кожен відвідувач. Edge Function розв’язує це одним файлом: браузер викликає функцію, функція викликає API з ключем із секретів проєкту і повертає лише потрібне. Той самий файл працює в Lovable і в Bolt, бо обидва ставлять бекенд на Supabase.
1. Функція
Section titled “1. Функція”supabase functions new big-threeЗамініть supabase/functions/big-three/index.ts на:
const SIGNS = ['Aries', 'Taurus', 'Gemini', 'Cancer', 'Leo', 'Virgo', 'Libra', 'Scorpio', 'Sagittarius', 'Capricorn', 'Aquarius', 'Pisces'];
const cors = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',};
const signOf = (longitude: number) => SIGNS[Math.floor(longitude / 30)];
Deno.serve(async (req) => { if (req.method === 'OPTIONS') return new Response('ok', { headers: cors });
const { date, time, timezone, latitude, longitude } = await req.json(); const res = await fetch('https://api.astroway.info/v1/chart', { method: 'POST', headers: { 'X-Api-Key': Deno.env.get('ASTROWAY_API_KEY') ?? '', 'Content-Type': 'application/json', }, body: JSON.stringify({ date, time, timezone, latitude, longitude }), }); const json = await res.json(); if (!json.ok) return Response.json({ error: json.error }, { status: res.status, headers: cors });
const planet = (name: string) => json.data.planets.find((p: { name: string }) => p.name === name); return Response.json({ sun: signOf(planet('Sun').longitude), moon: signOf(planet('Moon').longitude), rising: signOf(json.data.houses.ascendant), offset_used: json.data.input.timezoneOffset, }, { headers: cors });});2. Ключ у секретах
Section titled “2. Ключ у секретах”Створіть ключ Тільки сервер з областю chart і бюджетом, як описано в розділі Ключ для автоматизації, і покладіть його в секрети проєкту, а не в .env фронтенду:
supabase secrets set ASTROWAY_API_KEY=aw_live_...supabase functions deploy big-threeСекрет доступний функції як Deno.env.get('ASTROWAY_API_KEY') і не потрапляє ні в код, ні в браузер. Той самий секрет можна задати в дашборді Supabase: Edge Functions → Secrets.
3. Виклик зі сторінки
Section titled “3. Виклик зі сторінки”const { data, error } = await supabase.functions.invoke('big-three', { body: { date: '1990-05-15', time: '14:30:00', timezone: 'Europe/Kyiv', latitude: 50.45, longitude: 30.52 },});// data: { sun: 'Taurus', moon: 'Capricorn', rising: 'Virgo', offset_used: 4 }supabase-js сам додає ключ anon проєкту, тож функція з перевіркою JWT за замовчуванням приймає виклик без додаткових налаштувань. Помилку API функція передає далі з тим самим статусом і тілом error, тож error.message можна показати користувачеві як є.
Що варто знати
Section titled “Що варто знати”timezoneназвою зони.Europe/Kyiv, а не зсув: сервер сам знає, що Київ 1990-05-15 жив за UTC+4. Порожній рядок відхиляється з400 INVALID_FIELD, а відсутнє поле означає UTC. Деталі в розділі Інтеграції без коду.- Вартість.
POST /v1/chartкоштує 20 кредитів. Те саме тіло протягом п’яти хвилин повертається з кешу без списання. - Бюджет ключа. Функцію може викликати будь-хто, хто відкрив ваш сайт. Бюджет на ключі зупинить зациклений чи зловмисний клієнт на числі, яке ви задали, з
429 KEY_BUDGET_EXHAUSTED.