Subchapter 3.12
references/features-tasks.mdMarkdown3 KBView on GitHub
Tasks are one-off runtime operations (migrations, cleanups, cache refresh). Experimental — enable the flag first.
Files in tasks/[name].ts. Nested dirs join with : (e.g. tasks/db/migrate.ts → db:migrate). defineTask is auto-imported.
export default defineTask({
meta: {
name: "db:migrate",
description: "Run database migrations",
},
run({ payload, context }) {
console.log("Running DB migration...");
return { result: "Success" };
},
});run receives a TaskEvent with name, payload (Record<string, unknown>), and context (may include waitUntil). Return { result }.
Tasks can also be registered in config (config handler wins over a scanned file of the same name):
export default defineConfig({
experimental: { tasks: true },
tasks: {
"db:migrate": { handler: "./tasks/custom-migrate.ts", description: "Migrations" },
},
});Map cron expressions to task name(s). Multiple tasks under one expression run in parallel; scheduled runs get a payload.scheduledTime timestamp.
import { defineConfig } from "nitro";
export default defineConfig({
scheduledTasks: {
"* * * * *": ["cms:update"], // every minute
"0 0 * * *": "db:cleanup", // daily (string shorthand)
"*/5 * * * *": ["health:check", "metrics:collect"],
},
});Platform support:
dev, node_server, node_cluster, node_middleware, bun, deno_server → croner (opens in a new tab) engine.cloudflare_module / cloudflare_pages → native Cron Triggers (wrangler config auto-generated).vercel → native Cron Jobs (config auto-generated; secure with CRON_SECRET).import { defineHandler } from "nitro";
import { runTask } from "nitro/task";
export default defineHandler(async (event) => {
// IMPORTANT: authenticate and validate before running!
const payload = Object.fromEntries(event.url.searchParams);
const { result } = await runTask("db:migrate", { payload });
return { result };
});runTask throws a 404 if the task doesn’t exist, 501 if it has no handler; errors from run propagate to the caller.
export default defineTask({
run({ context }) {
const promise = fetch("https://api.example.com/sync");
context.waitUntil?.(promise);
return promise.then(() => ({ result: "ok" }));
},
});While nitro dev runs:
GET /_nitro/tasks — list available tasks + scheduled tasks.GET|POST /_nitro/tasks/:name — execute (payload from query and/or JSON body under "payload").nitro task list and nitro task run db:migrate --payload "{}".experimental.tasks: true; defineTask is auto-imported, runTask comes from nitro/task.scheduledTasks cron config is translated to native triggers on Cloudflare and Vercel automatically.