为了使用任务 API,您需要启用实验性功能标志。
import { defineNitroConfig } from "nitro/config";
export default defineNitroConfig({
experimental: {
tasks: true
}
})
export default defineNuxtConfig({
nitro: {
experimental: {
tasks: true
}
}
})
::
任务可以在 server/tasks/[name].ts 文件中定义。
支持嵌套目录。任务名称将通过 : 连接。(例:server/tasks/db/migrate.ts 任务名称将为 db:migrate)
示例:
export default defineTask({
meta: {
name: "db:migrate",
description: "运行数据库迁移",
},
run({ payload, context }) {
console.log("正在运行数据库迁移任务...");
return { result: "成功" };
},
});
您可以使用 Nitro 配置定义定时任务,以便在每段时间后自动运行。
import { defineNitroConfig } from "nitro/config";
export default defineNitroConfig({
scheduledTasks: {
// 每分钟运行一次 `cms:update` 任务
'* * * * *': ['cms:update']
}
})
export default defineNuxtConfig({
nitro: {
scheduledTasks: {
// 每分钟运行一次 `cms:update` 任务
'* * * * *': ['cms:update']
}
}
})
dev、node-server、bun 和 deno-server 预设支持 croner 引擎。cloudflare_module 预设与 Cron Triggers 具有原生集成。确保配置 wrangler 使用与您在 scheduledTasks 中定义的完全相同的模式以进行匹配。要手动运行任务,您可以使用 runTask(name, { payload? }) 工具。
示例:
export default eventHandler(async (event) => {
// 重要:身份验证用户和验证负载!
const payload = { ...getQuery(event) };
const { result } = await runTask("db:migrate", { payload });
return { result };
});
Nitro 内置的开发服务器使任务可以轻松执行,而无需编程使用。
/_nitro/tasks此端点返回可用的任务名称及其元数据的列表。
// [GET] /_nitro/tasks
{
"tasks": {
"db:migrate": {
"description": "运行数据库迁移"
},
"cms:update": {
"description": "更新 CMS 内容"
}
},
"scheduledTasks": [
{
"cron": "* * * * *",
"tasks": [
"cms:update"
]
}
]
}
/_nitro/tasks/:name此端点执行一个任务。您可以使用查询参数和主体 JSON 负载提供负载。发送的 JSON 主体负载必须位于 "payload" 属性下。
export default defineTask({
meta: {
name: "echo:payload",
description: "返回提供的负载",
},
run({ payload, context }) {
console.log("正在运行回声任务...");
return { result: payload };
},
});
// [GET] /_nitro/tasks/echo:payload?field=value&array=1&array=2
{
"field": "value",
"array": ["1", "2"]
}
/**
* [POST] /_nitro/tasks/echo:payload?field=value
* body: {
* "payload": {
* "answer": 42,
* "nested": {
* "value": true
* }
* }
* }
*/
{
"field": "value",
"answer": 42,
"nested": {
"value": true
}
}
nitro task list
nitro task run db:migrate --payload "{}"
每个任务只能有 一个运行实例。在并行调用同一个名称的任务多次时,实际上只调用一次,所有调用者将获得相同的返回值。