Skip to content

Recipe: Node.js / Express

Connect once at startup

typescript
// src/db.ts
import { createClient, type SchemasToClient } from "mondel";
import { schemas } from "./schemas";

export type DbClient = SchemasToClient<typeof schemas>;

export const db = await createClient({
  uri: process.env.MONGODB_URI!,
  schemas,
  validation: "strict",
  options: { maxPoolSize: 20 },
});
typescript
// src/server.ts
import express from "express";
import { db } from "./db";

const app = express();
app.use(express.json());

app.get("/users", async (_req, res) => {
  const users = await db.users.findMany({}, { limit: 100 });
  res.json(users);
});

app.post("/users", async (req, res) => {
  try {
    const result = await db.users.create(req.body);
    res.status(201).json({ id: result.insertedId });
  } catch (e) {
    res.status(400).json({ error: String(e) });
  }
});

const server = app.listen(3000);

async function shutdown() {
  await db.close();
  server.close();
  process.exit(0);
}

process.on("SIGTERM", shutdown);
process.on("SIGINT", shutdown);

Deploy indexes separately

bash
npx mondel push --uri "$MONGODB_URI" --schema ./dist/schemas.js --apply-validators

Middleware attachment (optional)

typescript
app.use((req, _res, next) => {
  (req as any).db = db;
  next();
});

Prefer importing db directly for clearer typing.

Released under the MIT License. · llms.txt