Una API con Node.js y Express

TeselaDB

TeselaDB

Equipo de TeselaDB

25 minPrincipiante

Construye 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.
  • Un clúster de TeselaDB y un usuario con readWrite sobre la base shop.
  • La cadena de conexión con TLS en la variable de entorno TESELADB_URI, como en Node.js.

1. Crea el proyecto

Shell
mkdir orders-api && cd orders-api
npm init -y
npm install express mongodb

2. Escribe la API

Guárdala como app.mjs. El cliente se crea una vez al arrancar y comparte sus conexiones entre todas las peticiones:

JavaScript
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:

Shell
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:

JavaScript
db.getSiblingDB("shop").orders.deleteMany({ customer: "Ana" });

Siguientes pasos