# 任务
> Nitro 任务允许在运行时进行开关操作。
Nitro v3 Alpha 文档仍在开发中 — 预计会有更新、不完善之处及偶尔的错误。
## 选择实验性功能
任务支持目前是实验性的。
请查看 [nitrojs/nitro#1974](https://github.com/nitrojs/nitro/issues/1974) 以获取相关讨论。
为了使用任务 API,您需要启用实验性功能标志。
```ts [nitro.config.ts]
import { defineNitroConfig } from "nitro/config";
export default defineNitroConfig({
experimental: {
tasks: true
}
})
```
```ts [nuxt.config.ts]
export default defineNuxtConfig({
nitro: {
experimental: {
tasks: true
}
}
})
```
::
## 定义任务
任务可以在 `server/tasks/[name].ts` 文件中定义。
支持嵌套目录。任务名称将通过 `:` 连接。(例:`server/tasks/db/migrate.ts` 任务名称将为 `db:migrate`)
**示例:**
```ts [tasks/db/migrate.ts]
export default defineTask({
meta: {
name: "db:migrate",
description: "运行数据库迁移",
},
run({ payload, context }) {
console.log("正在运行数据库迁移任务...");
return { result: "成功" };
},
});
```
## 定时任务
您可以使用 Nitro 配置定义定时任务,以便在每段时间后自动运行。
```ts [nitro.config.ts]
import { defineNitroConfig } from "nitro/config";
export default defineNitroConfig({
scheduledTasks: {
// 每分钟运行一次 `cms:update` 任务
'* * * * *': ['cms:update']
}
})
```
```ts [nuxt.config.ts]
export default defineNuxtConfig({
nitro: {
scheduledTasks: {
// 每分钟运行一次 `cms:update` 任务
'* * * * *': ['cms:update']
}
}
})
```
您可以使用 [crontab.guru](https://crontab.guru/) 来轻松生成和理解 cron 表达式模式。
### 平台支持
- `dev`、`node-server`、`bun` 和 `deno-server` 预设支持 [croner](https://croner.56k.guru/) 引擎。
- `cloudflare_module` 预设与 [Cron Triggers](https://developers.cloudflare.com/workers/configuration/cron-triggers/) 具有原生集成。确保配置 wrangler 使用与您在 `scheduledTasks` 中定义的完全相同的模式以进行匹配。
- 计划支持更多预设(具有原生原语支持)!
## 程序化运行任务
要手动运行任务,您可以使用 `runTask(name, { payload? })` 工具。
**示例:**
```ts [api/migrate.ts]
export default eventHandler(async (event) => {
// 重要:身份验证用户和验证负载!
const payload = { ...getQuery(event) };
const { result } = await runTask("db:migrate", { payload });
return { result };
});
```
## 使用开发服务器运行任务
Nitro 内置的开发服务器使任务可以轻松执行,而无需编程使用。
### 使用 API 路由
#### `/_nitro/tasks`
此端点返回可用的任务名称及其元数据的列表。
```json
// [GET] /_nitro/tasks
{
"tasks": {
"db:migrate": {
"description": "运行数据库迁移"
},
"cms:update": {
"description": "更新 CMS 内容"
}
},
"scheduledTasks": [
{
"cron": "* * * * *",
"tasks": [
"cms:update"
]
}
]
}
```
#### `/_nitro/tasks/:name`
此端点执行一个任务。您可以使用查询参数和主体 JSON 负载提供负载。发送的 JSON 主体负载必须位于 `"payload"` 属性下。
```ts [tasks/echo/payload.ts]
export default defineTask({
meta: {
name: "echo:payload",
description: "返回提供的负载",
},
run({ payload, context }) {
console.log("正在运行回声任务...");
return { result: payload };
},
});
```
```json [GET]
// [GET] /_nitro/tasks/echo:payload?field=value&array=1&array=2
{
"field": "value",
"array": ["1", "2"]
}
```
```json [POST]
/**
* [POST] /_nitro/tasks/echo:payload?field=value
* body: {
* "payload": {
* "answer": 42,
* "nested": {
* "value": true
* }
* }
* }
*/
{
"field": "value",
"answer": 42,
"nested": {
"value": true
}
}
```
包含在正文中的 JSON 负载将覆盖查询参数中存在的键。
### 使用 CLI
只能在 **开发服务器运行** 时运行这些命令。您应该在第二个终端中运行它们。
#### 列出任务
```sh
nitro task list
```
#### 运行任务
```sh
nitro task run db:migrate --payload "{}"
```
## 注意事项
### 并发
每个任务只能有 **一个运行实例**。在并行调用同一个名称的任务多次时,实际上只调用一次,所有调用者将获得相同的返回值。
Nitro 任务可以多次同时运行。