How to Set Up Scheduled Cron Jobs in Node.js Without a Server Using Cloudflare Workers and Durable Objects

Running scheduled tasks like database cleanups, email reminders, or periodic data fetching traditionally requires a server or a cron scheduler — which usually costs money or infrastructure. But using Cloudflare Workers and Durable Objects, you can schedule cron-like tasks completely serverlessly. Why Use Cloudflare Workers for Cron? Free-tier available No infrastructure to manage Edge-deployed functions Easy integration with APIs, storage, or databases Step 1: Install Wrangler npm install -g wrangler Initialize your project: wrangler init scheduled-job --type=javascript cd scheduled-job Step 2: Enable Scheduled Events in wrangler.toml [triggers] crons = ["0 */1 * * *"] # every hour on the hour This follows the standard crontab syntax. You can schedule it every minute, hour, day, etc. Step 3: Add the Scheduled Handler export default { async scheduled(controller, env, ctx) { console.log("Cron job triggered!"); // Example: Cleanup logic await fetch("https://your-api.com/cleanup", { method: "POST" }); }, async fetch(request, env, ctx) { return new Response("Worker is live!"); } } This defines a worker that performs a task on schedule and responds normally to HTTP requests. Step 4: Deploy wrangler deploy Your cron jobs are now running without a traditional server. Step 5 (Optional): Use Durable Objects for Stateful Logic If you need to keep state between cron executions (e.g., counters, timestamps), use Durable Objects: export class CronState { constructor(state, env) { this.state = state; } async fetch(request) { let value = await this.state.storage.get("lastRun"); return new Response("Last ran at: " + value); } async scheduled(controller, env, ctx) { const now = new Date().toISOString(); await this.state.storage.put("lastRun", now); } } Configure Durable Object binding in wrangler.toml and attach it in your main Worker file. Pros and Cons ✅ Pros Zero-cost scheduled tasks with high reliability No server or Docker containers to maintain Integrated state via Durable Objects ⚠️ Cons Max 3 scheduled events per Worker on the free tier Limited to 1-minute granularity More complex than traditional crontab for simple tasks

Apr 22, 2025 - 02:47
 0
How to Set Up Scheduled Cron Jobs in Node.js Without a Server Using Cloudflare Workers and Durable Objects

Running scheduled tasks like database cleanups, email reminders, or periodic data fetching traditionally requires a server or a cron scheduler — which usually costs money or infrastructure. But using Cloudflare Workers and Durable Objects, you can schedule cron-like tasks completely serverlessly.

Why Use Cloudflare Workers for Cron?

  • Free-tier available
  • No infrastructure to manage
  • Edge-deployed functions
  • Easy integration with APIs, storage, or databases

Step 1: Install Wrangler

npm install -g wrangler

Initialize your project:

wrangler init scheduled-job --type=javascript
cd scheduled-job

Step 2: Enable Scheduled Events in wrangler.toml

[triggers]
crons = ["0 */1 * * *"]  # every hour on the hour

This follows the standard crontab syntax. You can schedule it every minute, hour, day, etc.

Step 3: Add the Scheduled Handler

export default {
  async scheduled(controller, env, ctx) {
    console.log("Cron job triggered!");

    // Example: Cleanup logic
    await fetch("https://your-api.com/cleanup", { method: "POST" });
  },

  async fetch(request, env, ctx) {
    return new Response("Worker is live!");
  }
}

This defines a worker that performs a task on schedule and responds normally to HTTP requests.

Step 4: Deploy

wrangler deploy

Your cron jobs are now running without a traditional server.

Step 5 (Optional): Use Durable Objects for Stateful Logic

If you need to keep state between cron executions (e.g., counters, timestamps), use Durable Objects:

export class CronState {
  constructor(state, env) {
    this.state = state;
  }

  async fetch(request) {
    let value = await this.state.storage.get("lastRun");
    return new Response("Last ran at: " + value);
  }

  async scheduled(controller, env, ctx) {
    const now = new Date().toISOString();
    await this.state.storage.put("lastRun", now);
  }
}

Configure Durable Object binding in wrangler.toml and attach it in your main Worker file.

Pros and Cons

✅ Pros

  • Zero-cost scheduled tasks with high reliability
  • No server or Docker containers to maintain
  • Integrated state via Durable Objects

⚠️ Cons

  • Max 3 scheduled events per Worker on the free tier
  • Limited to 1-minute granularity
  • More complex than traditional crontab for simple tasks