Skip to content

Express

Integration with Express.js using middleware.

Basic Setup

typescript
import express from 'express';
import { createTenantManager, createExpressMiddleware, createTenantContext } from 'drizzle-multitenant';
import config from './tenant.config';

const app = express();
const tenants = createTenantManager(config);
const tenantContext = createTenantContext();

// Apply tenant middleware
app.use(
  createExpressMiddleware({
    manager: tenants,
    context: tenantContext,
    extractTenantId: (req) => req.headers['x-tenant-id'] as string,
    onTenantResolved: (tenantId) => {
      console.log(`Tenant: ${tenantId}`);
    },
  })
);

Using in Routes

typescript
app.get('/users', async (req, res) => {
  const db = req.tenantContext!.db;
  const users = await db.select().from(schema.users);
  res.json(users);
});

app.post('/users', async (req, res) => {
  const db = req.tenantContext!.db;
  const { email, name } = req.body;

  const [user] = await db
    .insert(schema.users)
    .values({ email, name })
    .returning();

  res.status(201).json(user);
});

Middleware Options

typescript
createExpressMiddleware({
  manager: tenants,
  context: tenantContext,
  extractTenantId: (req) => req.headers['x-tenant-id'] as string,
  validateTenant: async (id) => checkTenantExists(id),
  onTenantResolved: (tenantId, req) => { /* ... */ },
  onError: (error, req, res, next) => { /* ... */ },
});
OptionTypeDescription
managerTenantManagerRequired. The tenant manager instance
contextTenantContextOptional. Context for propagation
extractTenantId(req) => stringRequired. Extract tenant ID from request
validateTenant(id) => Promise<boolean>Optional. Validate tenant exists
onTenantResolved(tenantId, req) => voidOptional. Called when tenant is resolved
onError(error, req, res, next) => voidOptional. Error handler

Async Methods with Retry

typescript
app.get('/users', async (req, res) => {
  const tenantId = req.headers['x-tenant-id'] as string;

  // getDbAsync includes automatic retry with exponential backoff
  const db = await tenants.getDbAsync(tenantId);
  const users = await db.select().from(schema.users);

  res.json(users);
});

Full Example

See the Express example for a complete working project.

Released under the MIT License.