Skip to content

Express extension

UQL provides a built-in Express middleware to automatically generate RESTful APIs for your entities with zero boilerplate. It handles the entire request lifecycle, including query parsing, transaction management, and automatic querier release.

  1. Initialize the querierMiddleware in your Express app:
import express from 'express';
import { querierMiddleware } from '@uql/core/express';
import { pool } from './uql.config.js';
import { User, Post } from './shared/models/index.js';
const app = express();
app.use(express.json());
// This will automatically generate routes like /api/user and /api/post
app.use('/api', querierMiddleware({
include: [User, Post]
}));
app.listen(3000);

The middleware is highly customizable, allowing you to intercept requests, filter data based on the authenticated user, and more.

app.use('/api', querierMiddleware({
// Intercept every request
pre(req, meta) {
console.log(`Processing ${req.method} on ${meta.name}`);
},
// Intercept save operations (POST, PATCH, PUT)
preSave(req, meta) {
// Automatically set the creatorId from the session
req.body.creatorId = req.user.id;
},
// Intercept filter operations (GET, DELETE)
preFilter(req, meta) {
// Enforce Row-Level Security: users only see their own data
req.query.$where = {
...req.query.$where,
creatorId: req.user.id
};
}
}));
HookLifecycleUse Case
preBefore every operation.Logging, auditing, global validation.
preSaveBefore POST, PATCH, PUT.Injecting creatorId, updatedAt, or data sanitization.
preFilterBefore GET, DELETE.Row-level security, tenant isolation, enforcing softDelete.

For an entity named User, the following endpoints are automatically generated:

MethodEndpointDescription
GET/userList users (supports pagination, filtering, and sorting).
GET/user/:idGet a single user by ID.
POST/userCreate a new user.
PATCH/user/:idUpdate a user partially.
DELETE/user/:idDelete a user (supports soft-delete if configured).