/** * Example: using backend-toolkit inside an Express app. * * Requires express to be installed separately: * npm install express * * Run with: node examples/express.js */ const express = require("express"); const { z } = require("zod"); const { success, error, asyncHandler, validate, rules, hashPassword, signToken, paginate, getPaginationParams, logger, } = require("../src/index"); const app = express(); app.use(express.json()); const users = []; const createUserSchema = z.object({ email: rules.email, password: rules.password }); app.post( "/users", asyncHandler(async (req, res) => { const result = validate(createUserSchema, req.body); if (!result.success) { return res.status(400).json(error("Validation failed", 400, result.errors)); } const passwordHash = await hashPassword(result.data.password); const user = { id: users.length + 1, email: result.data.email, passwordHash }; users.push(user); const token = signToken({ userId: user.id }, process.env.JWT_SECRET || "dev-secret", { expiresIn: "1h", }); logger.info(`Created user #${user.id}`); return res.status(201).json(success({ id: user.id, token }, "User created", 201)); }) ); app.get( "/users", asyncHandler(async (req, res) => { const { page, limit } = getPaginationParams(req.query); const meta = paginate({ page, limit, totalItems: users.length }); const items = users .slice(meta.offset, meta.offset + meta.limit) .map((u) => ({ id: u.id, email: u.email })); return res.json(success({ items, meta }, "Users fetched")); }) ); // Central error handler — every asyncHandler-wrapped route lands here on failure. app.use((err, req, res, _next) => { logger.error(err.message); res.status(500).json(error(err.message, 500)); }); const port = process.env.PORT || 3000; app.listen(port, () => logger.info(`Example app listening on port ${port}`));