Una API con Node.js y Express
25 minPrincipiante

En esta guía aprenderás a montar una API de pedidos con Express y el driver oficial de MongoDB que guarda y lee en TeselaDB.
Una API de Node.js usa TeselaDB con el driver oficial de MongoDB, igual que usaría MongoDB. Aquí escribes con Express una API de pedidos con un endpoint para crear un pedido y otro para leerlo.
Lo que vas a construir
Un servidor Express en el puerto 3000 con POST /orders, que valida el pedido y lo guarda, y GET /orders/:id, que lo
devuelve o responde 404.
Requisitos
- Node.js 18 o posterior.
- Docker y
mongosh, para arrancar TeselaDB en tu máquina y mirar los datos.
Prepara el entorno
docker run -d --name teseladb -p 27017:27017 viuzi/teseladb:latest \
start --dbpath /data --insecure --insecure-allow-remote --bind_ip 0.0.0.0
export TESELADB_URI="mongodb://127.0.0.1:27017/shop"
mongosh "$TESELADB_URI" --quiet --eval 'db.runCommand({ ping: 1 }).ok'El contenedor arranca un nodo de TeselaDB sin TLS ni usuarios, que basta para seguir la guía en tu máquina. Cuando mongosh responde 1, el nodo ya acepta conexiones. TESELADB_URI apunta a ese nodo y a la base shop; en un clúster de producción la cadena lleva TLS y usuario, como cuenta Conectar tu aplicación.
1. Crea el proyecto
mkdir orders-api && cd orders-api
npm init -y
npm install express mongodb2. Escribe la API
Guárdala como app.mjs. El cliente se crea una vez al arrancar y comparte sus conexiones entre todas las peticiones:
import express from "express";
import { MongoClient, ObjectId } from "mongodb";
const client = new MongoClient(process.env.TESELADB_URI);
const orders = client.db("shop").collection("orders");
const app = express();
app.use(express.json());
app.post("/orders", async (req, res) => {
const { customer, total } = req.body;
if (typeof customer !== "string" || typeof total !== "number" || total < 0) {
return res.status(400).json({ error: "customer and a total of 0 or more are required" });
}
const { insertedId } = await orders.insertOne({ customer, total, createdAt: new Date() });
res.status(201).json({ id: insertedId });
});
app.get("/orders/:id", async (req, res) => {
if (!ObjectId.isValid(req.params.id)) return res.status(404).end();
const order = await orders.findOne({ _id: new ObjectId(req.params.id) });
if (!order) return res.status(404).end();
res.json(order);
});
await client.connect();
app.listen(3000, () => console.log("listening on 3000"));Probarlo
Arranca el servidor con node app.mjs. Después, en otra terminal, crea un pedido de Ana con un total de 30 y léelo con el
id que devuelve la primera petición, que sustituye a <id> en la segunda orden:
curl -s -X POST localhost:3000/orders -H "content-type: application/json" -d '{"customer":"Ana","total":30}'
curl -s localhost:3000/orders/<id>La primera orden devuelve {"id":"…"} y la segunda, el pedido con su fecha de creación. Un pedido sin total
responde 400.
Limpiar
Para el servidor con Ctrl+C y borra los pedidos de prueba desde mongosh. Al final borra también el contenedor con la última orden: el nodo guarda los datos dentro, sin volumen, así que con él desaparece todo lo que escribiste durante la guía y el puerto 27017 queda libre:
db.getSiblingDB("shop").orders.deleteMany({ customer: "Ana" });docker rm -f teseladbSiguientes pasos
- Inventario sin vender de más, con una transacción entre el stock y el pedido.
- Garantías de escritura y reintentos, para elegir el write concern de la API.