Skip to content
Contents

Express

You can easily use Background with express.

Here is a structured approach to use Background with express.

Example Usage

typescript
// types.ts
import { JobQueue } from "@backgroundjs/core";

declare global {
    namespace Express {
        interface Request {
            queues?: JobQueue[];
        }
    }
}

//expressJobs.middleware.ts
import { Express } from "express";
import { JobQueue } from "@backgroundjs/core";

export const expressJobs = (app: Express, queues: JobQueue[]) => {
    queues.forEach((queue) => {
        queue.start();
    });
    app.use((req, res, next) => {
        req.queues = queues;
        next();
    });
    
    ["SIGINT", "SIGTERM"].forEach((signal) => {
        process.on(signal, () => {
            for (const queue of queues) {
                queue.stop();
            }
        });
    });
};

//server.ts
import express from "express";
import { expressJobs } from "./expressJobs.middleware";
import { InMemoryJobStorage, JobQueue } from "@backgroundjs/core";

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

const storage = new InMemoryJobStorage();
const queue = new JobQueue(storage,{
    name: "test-queue",
    concurrency: 1,
    processingInterval: 200,
    logging: true,
    intelligentPolling: true,
    minInterval: 100,
    maxInterval: 5000,
    maxEmptyPolls: 5,
    loadFactor: 0.5,
    maxConcurrency: 10,
});

queue.register("test-job", async (data) => {
    await new Promise((resolve) => setTimeout(resolve, 3000));
    console.log("job completed", data);
    return data;
});

expressJobs(app, [queue]);

app.get("/job/:id", (req, res) => {
    const jobId = req.params.id;
    const job = storage.getJob(jobId);
    res.json(job);
});

app.post("/job", async (req, res) => {
    const queues = req.queues;
    const testQueue = queues?.find((q) => q.getName() === "test-queue");
    if (!testQueue) {
        res.status(404).json({ error: "Queue not found" });
        return;
    }
    const job = await testQueue.add("test-job", req.body);
    res.json(job);
});

app.listen(3000, () => {
  console.log("Server is running on port 3000");
});