-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Labels
documentationImprovements or additions to documentationImprovements or additions to documentationerror fixednetwork
Description
πTIL - 2024-02-04-Tuesday
π μ€λμ νμ΅
- π μ£Όμ νμ΅ λ΄μ© 1: λ€νΈμν¬ μμ²
Fastify, fetch, async/await, axios - π μ£Όμ νμ΅ λ΄μ© 2: glitch λ₯Ό ν΅ν Gemini λ₯Ό μ΄μ©ν μΉμ¬μ΄νΈ λ°°ν¬.
const path = require("path"); // path λͺ¨λμ λΆλ¬μμ νμΌ κ²½λ‘ κ΄λ ¨ μμ
μ ν μ μκ² ν¨
const axios = require('axios'); // axiosλ₯Ό μ¬μ©ν΄ HTTP μμ²μ 보λ΄κΈ° μν΄ λΆλ¬μ΄
const fastify = require("fastify")({
logger: true, // Fastify μλ²μμ λ‘κΉ
κΈ°λ₯μ νμ±ννμ¬ μμ²κ³Ό μλ΅μ λ‘κ·Έλ‘ μΆλ ₯ν μ μκ² ν¨
});
fastify.get("/", async function (request, reply) { // 루νΈ("/") κ²½λ‘μ λν GET μμ²μ μ²λ¦¬νλ μλν¬μΈνΈ μ μ
const { GEMINI_KEY } = process.env; // νκ²½ λ³μμμ GEMINI_KEY κ°μ μ½μ΄μ΄
if (!GEMINI_KEY) { // λ§μ½ GEMINI_KEYκ° νκ²½ λ³μμ μμΌλ©΄
return reply.status(500).send({ error: "GEMINI_KEY νκ²½ λ³μκ° μ€μ λμ§ μμμ΅λλ€." }); // 500 μλ¬μ ν¨κ» λ©μμ§λ₯Ό λ°ν
}
console.log("GEMINI_KEY:", GEMINI_KEY); // GEMINI_KEY κ°μ λ‘κΉ
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${GEMINI_KEY}`; // API μμ²μ λ³΄λΌ URL μμ± (GEMINI_KEYλ₯Ό ν¬ν¨ν URL)
try {
const response = await axios.post(url, { // POST μμ²μ 보λ΄μ APIλ‘λΆν° λ°μ΄ν°λ₯Ό λ°μμ΄
contents: [ // μμ² λ³Έλ¬Έμ ν¬ν¨ν λ°μ΄ν° μ μ
{
parts: [
{
text: "μ€λ μ΄λμ κ°κΉμ λ§κΉμ? νλΉν μ΄μ . ν΅μ¬λ§.", // μ§λ¬Έ ν
μ€νΈ
},
],
},
],
});
const json = response.data; // μλ΅ λ°μ λ°μ΄ν°λ₯Ό JSON ννλ‘ νμ±
const answer = json.candidates[0].content.parts[0].text; // JSONμμ νμν λ΅λ³μ μΆμΆ
return answer; // μΆμΆν λ΅λ³μ ν΄λΌμ΄μΈνΈμ λ°ν
} catch (error) { // API νΈμΆ μ€ μλ¬κ° λ°μνμ κ²½μ°
console.error("Error during API call:", error); // μλ¬λ₯Ό λ‘κ·Έλ‘ μΆλ ₯
return reply.status(500).send({ error: "API νΈμΆ μ€ μ€λ₯κ° λ°μνμ΅λλ€." }); // 500 μλ¬μ ν¨κ» λ©μμ§λ₯Ό λ°ν
}
});
fastify.listen(
{ port: process.env.PORT || 3000, host: "0.0.0.0" }, // μλ²κ° μμ²μ κΈ°λ€λ¦΄ ν¬νΈμ νΈμ€νΈ μ§μ
function (err, address) {
if (err) { // μλ²κ° μμν λ μ€λ₯κ° λ°μνλ©΄
console.error(err); // μ€λ₯λ₯Ό λ‘κ·Έλ‘ μΆλ ₯
process.exit(1); // μλ²λ₯Ό μ’
λ£
}
console.log(`Your app is listening on ${address}`); // μλ²κ° μ μμ μΌλ‘ μμλλ©΄ μ£Όμλ₯Ό μΆλ ₯
}
);
.env api key μ λ ₯
μ΄ μ½λμμλ CORSλ₯Ό μ²λ¦¬νμ§ μκΈ° λλ¬Έμ, λ€λ₯Έ λλ©μΈμμμ μμ²μ λ°μ λ CORS μλ¬κ° λ°μν μ μλ€. λΈλΌμ°μ λ 보μμ λ€λ₯Έ λλ©μΈμμ μ€λ μμ²μ κΈ°λ³Έμ μΌλ‘ μ ννλ©°, μ΄λ₯Ό ν΄κ²°νλ €λ©΄ μλ²μμ λͺ μμ μΌλ‘ CORS μ μ± μ μ€μ ν΄μΌ ν¨.
π¨ λ¬Έμ μν©
- ν΄λΌμ΄μΈνΈμμ API μμ²μ 보λ΄λλ°, CORS μλ¬κ° λ°μνμλ€.
π― μλν κ³Όμ
- Fastify μλ²λ₯Ό μμ±νκ³ μΈλΆ APIλ₯Ό νΈμΆνλ μ½λ μμ± μ€, λ€λ₯Έ λλ©μΈμμμ μμ²μ λν 보μ μ μ± μΌλ‘ CORS λ¬Έμ κ° λ°μν¨.
π οΈ ν΄κ²° λ°©λ²
- @fastify/cors νλ¬κ·ΈμΈμ μ¬μ©νμ¬ μλ²μμ CORS μ μ± μ λͺ μμ μΌλ‘ μ€μ ν¨μΌλ‘μ¨ λͺ¨λ λλ©μΈμμμ μμ²μ νμ©νλλ‘ λ³κ²½νμλ€. μ΄λ₯Ό ν΅ν΄ CORS μλ¬λ₯Ό ν΄κ²°.
const path = require("path");
const axios = require('axios');
const fastify = require("fastify")({
logger: true, // λ‘κΉ
μ νμ±ν
});
// npm install @fastify/cors@8
// fastify-cors νλ¬κ·ΈμΈ μΆκ°
fastify.register(require('@fastify/cors'), {
origin: "*", // λͺ¨λ λλ©μΈμμ μμ²μ νμ©
});
fastify.get("/", async function (request, reply) {
// νκ²½ λ³μκ° μ λλ‘ λ‘λλμλμ§ νμΈ
const { GEMINI_KEY } = process.env;
if (!GEMINI_KEY) {
return reply.status(500).send({ error: "GEMINI_KEY νκ²½ λ³μκ° μ€μ λμ§ μμμ΅λλ€." });
}
console.log("GEMINI_KEY:", GEMINI_KEY);
const url = `https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash:generateContent?key=${GEMINI_KEY}`;
try {
const response = await axios.post(url, {
contents: [
{
parts: [
{
text: "μ΄λ‘νλ©΄ νμλ€μ΄ μ νν
μ§μ€ν΄μ€κΉμ? 20μ μ΄λ΄λ‘. ν΅μ¬λ§.",
},
],
},
],
});
// JSON ννλ‘ μλ΅μ΄ μ€κΈ° λλ¬Έμ, λ³λλ‘ JSON.parseλ₯Ό ν νμ μμ΄ λ°λ‘ μ¬μ© κ°λ₯
const json = response.data;
// μλ΅μ ꡬ쑰μ λ§κ² νμν κ°μ μΆμΆ
const answer = json.candidates[0].content.parts[0].text;
return answer; // κ²°κ³Όλ₯Ό ν΄λΌμ΄μΈνΈμκ² λ°ν
} catch (error) {
console.error("Error during API call:", error);
return reply.status(500).send({ error: "API νΈμΆ μ€ μ€λ₯κ° λ°μνμ΅λλ€." });
}
});
fastify.listen(
{ port: process.env.PORT || 3000, host: "0.0.0.0" },
function (err, address) {
if (err) {
console.error(err);
process.exit(1);
}
console.log(`Your app is listening on ${address}`);
}
);
π³ λλ μ
- CORSλ κΈ°λ³Έμ μΌλ‘ λ€λ₯Έ λλ©μΈμμ μ€λ μμ²μ μ°¨λ¨νλ 보μ μ μ± μΌλ‘, μ΄λ₯Ό ν΄κ²°νλ €λ©΄ μλ²μμ CORS ν€λλ₯Ό μ€μ ν΄μΌ νλ€λ μ μ μ΄ν΄νμλ€. origin: "*" μ€μ μΌλ‘ λͺ¨λ λλ©μΈμμ μμ²μ νμ©νκ² λ¨.
- κ²°λ‘ μ μΌλ‘, VScodeμμ λ‘컬 μλ²κ° λ€λ₯Έ λλ©μΈμ μμ²μ λ³΄λΌ λ CORS λ¬Έμ κ° λ°μν μ μμΌλ©°, μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ μλ² μΈ‘μμ CORSλ₯Ό νμ©ν΄μ£Όμ΄μΌ νλ€. κΈλ¦¬μΉ μλ²μμλ CORS λ¬Έμ κ° λ°μνμ§ μμ§λ§, μμ²μ λ°λ μλ²κ° CORS μ€μ μ ν΄μΌλ§ μ μμ μΌλ‘ λ°μ΄ν°λ₯Ό λ°μ μ μλ€.
π©βπ» μ°Έκ³ μλ£
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
documentationImprovements or additions to documentationImprovements or additions to documentationerror fixednetwork

