Parte 2: Enrutamiento y Datos¶
Estado verificado al 28 de marzo de 2026. Nota de runtime: FastFN auto-instala dependencias locales por función desde
requirements.txt/package.json; enfastfn dev --nativenecesitas runtimes instalados en host, mientras quefastfn devdepende de Docker daemon activo.
Vista rápida¶
- Complejidad: Intermedio
- Tiempo típico: 25-35 minutos
- Resultado: manejo dinámico de path/query/body con validaciones explícitas
1. Path params y catch-all¶
Crea rutas dinámicas bajo functions/.
Archivo: functions/tasks/[id].js
Archivo: functions/reports/[...slug].js
Archivo: functions/tasks/[id].py
Archivo: functions/tasks/[id].rs
Curls de validación (iguales para todos los runtimes):
2. Query params con defaults¶
Archivo: functions/tasks/search.js
Archivo: functions/tasks/search.py
Archivo: functions/tasks/search.rs
Archivo: functions/tasks/search.php
Curls por runtime:
3. Parseo JSON y validación de body¶
Archivo: functions/tasks/post.js
exports.handler = async (event) => {
let payload;
try { payload = JSON.parse(event.body || "{}"); }
catch { return { status: 400, body: { error: "JSON body inválido" } }; }
if (!payload.title || typeof payload.title !== "string") {
return { status: 422, body: { error: "title debe ser string no vacío" } };
}
return { status: 201, body: { id: 3, title: payload.title } };
};
Archivo: functions/tasks/post.py
import json
def handler(event):
try:
payload = json.loads(event.get("body") or "{}")
except Exception:
return {"status": 400, "body": {"error": "JSON body inválido"}}
if not payload.get("title"):
return {"status": 422, "body": {"error": "title debe ser string no vacío"}}
return {"status": 201, "body": {"id": 3, "title": payload["title"]}}
Archivo: functions/tasks/post.rs
use serde_json::{json, Value};
pub fn handler(event: Value) -> Value {
let payload = event.get("body").and_then(|b| b.as_str()).unwrap_or("{}");
let parsed: Value = serde_json::from_str(payload).unwrap_or(json!({"_error": "invalid"}));
if parsed.get("_error").is_some() {
return json!({"status": 400, "body": {"error": "JSON body inválido"}});
}
if parsed.get("title").and_then(|x| x.as_str()).unwrap_or("").is_empty() {
return json!({"status": 422, "body": {"error": "title debe ser string no vacío"}});
}
json!({"status": 201, "body": {"id": 3, "title": parsed["title"]}})
}
Archivo: functions/tasks/post.php
<?php
function handler(array $event): array {
$raw = $event['body'] ?? '{}';
$payload = json_decode($raw, true);
if (!is_array($payload)) return ['status' => 400, 'body' => ['error' => 'JSON body inválido']];
if (empty($payload['title']) || !is_string($payload['title'])) {
return ['status' => 422, 'body' => ['error' => 'title debe ser string no vacío']];
}
return ['status' => 201, 'body' => ['id' => 3, 'title' => $payload['title']]];
}
Curls por runtime:
Diagrama de flujo¶
flowchart LR
A["Path"] --> B["Extracción params"]
B --> C["Parseo query"]
C --> D["Parseo body"]
D --> E["Validación"]
E --> F["Respuesta HTTP"]
Solución de problemas¶
- handler incorrecto: revisa prefijos de método y nombre de archivo
- params vacíos: confirma patrón
[id]o[...slug] - parseo body falla: revisa
Content-Type: application/jsony JSON válido
Próximo paso¶
Ir a la Parte 3: Configuración y Secretos