Integracion con Express
Variables de entorno
ENGINE_HTTP_URL=https://api.disnomia.econdor.comENGINE_API_KEY=pi_com_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxENGINE_TIMEOUT_MS=5000Instalacion
npm install axiosCliente minimo
import axios from 'axios';
const client = axios.create({ baseURL: process.env.ENGINE_HTTP_URL, timeout: parseInt(process.env.ENGINE_TIMEOUT_MS ?? '5000'), headers: { 'x-api-key': process.env.ENGINE_API_KEY },});
export interface EvaluatePayload { exerciseId: string; area: string; type: string; answer: string; correctAnswer?: string | string[]; content?: Record<string, unknown>; difficulty?: number;}
export async function evaluate(payload: EvaluatePayload) { const { data } = await client.post('/api/v1/exercises/evaluate', payload); return data as { correct: boolean; score: number; feedback: string; metadata: { area: string; type: string }; };}Uso en una ruta Express
import { Router } from 'express';import { evaluate } from '../lib/disnomia';
const router = Router();
router.post('/submit', async (req, res) => { try { const result = await evaluate({ exerciseId: req.body.exerciseId, area: req.body.area, type: req.body.type, answer: req.body.answer, correctAnswer: req.body.correctAnswer, }); res.json(result); } catch (err: any) { const status = err.response?.status ?? 500; const message = err.response?.data?.message ?? 'Engine error'; res.status(status).json({ error: message }); }});
export default router;Con fetch nativo (Node 18+)
Sin dependencias externas:
async function evaluate(payload: Record<string, unknown>) { const res = await fetch( `${process.env.ENGINE_HTTP_URL}/api/v1/exercises/evaluate`, { method: 'POST', headers: { 'Content-Type': 'application/json', 'x-api-key': process.env.ENGINE_API_KEY!, }, body: JSON.stringify(payload), signal: AbortSignal.timeout(5000), }, );
if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(`Engine ${res.status}: ${err.message ?? res.statusText}`); }
return res.json();}