# 定時任務
[TOC=2,3]
項目在線上運行時,經常要定時去執行某個功能,這時候就需要使用定時任務來處理了。ThinkJS 支持命令行方式調用,結合系統的 crontab 功能可以很好的支持定時任務。
## 命令行執行
ThinkJS 除了支持通過 URL 訪問來執行外,還可以通過命令行的方式調用執行。使用方式如下:
~~~
node www/production.js home/index/index
~~~
上面的命令表示執行?`home`?模塊下?`index`?Controller 里的 indexAction。
#### 攜帶參數
如果需要加參數,只要在后面加上對應的參數即可:
~~~
node www/production.js home/index/index?name=thinkjs
~~~
Action 里就可以通過?`this.get`?方法來獲取參數?`name`?了。
#### 修改請求方法
命令行執行默認的請求類型是 GET,如果想改為其他的類型,可以用下面的方法:
~~~
node www/production.js url=home/index/index&method=post
~~~
這樣就把請求類型改為了 post。但這種方式下,參數 url 的值里就不能包含 & 字符了(可以通過上面 / 的方式指定參數)。
除了修改請求類型,還可以修改下面的參數:
* `host`?修改請求的 host 默認為 127.0.0.1
* `ip`?修改請求的 ip 默認為 127.0.0.1
#### 修改 header
有時候如果想修改更多的 headers,可以傳一個完整的 json 數據,如:
~~~
node www/production.js {"url":"/index/index","ip":"127.0.0.1","method":"POST","headers":{"xxx":"yyyy"}}
~~~
#### 禁止 URL 訪問
默認情況下,命令行執行的 Action 通過 URL 也可以訪問到。如果禁止 URL 訪問到該 Action,可以通過`think.cli`?來判斷。如:
~~~
export default class extends think.controller.base {
indexAction(){
//禁止 URL 訪問該 Action
if(!think.cli){
this.fail("only invoked in cli mode");
}
...
}
}
~~~
## 執行腳本
可以創建一個簡單的執行腳本來調用命令行執行,如:
~~~
cd project_path;
node www/prodution.js home/index/index;
~~~
在項目目錄下創建目錄?`crontab`,將上面執行腳本存為一個文件放在該目錄下。
## 定時執行
借助系統里的 crontab 可以做到定時執行,通過命令?`crontab -e`?來編輯定時任務,如:
~~~
0 */1 * * * /bin/sh project_path/crontab/a.sh # 1 小時執行一次
~~~
## 使用 node-crontab 模塊執行定時任務
除了使用 crontab 和命令行聯合執行定時任務外,也可以使用?`node-crontab`?模塊執行定時任務。如:
~~~
import crontab from "node-crontab";
// 1 小時執行一次
let jobId = crontab.scheduleJob("0 */1 * * *", () => {
});
~~~
將上面代碼文件存放在?`src/common/bootstrap`?目錄下,這樣可以在服務啟動時自動執行。
- 快速入門
- 介紹
- 創建項目
- 項目結構
- 代碼規范
- 升級指南
- 進階應用
- 模塊
- 控制器
- 視圖
- 配置
- 路由
- 模型
- 介紹
- 事務
- 關聯模型
- Mysql
- MongoDB
- SQLite
- Adapter
- 介紹
- Cache
- Session
- WebSocket
- Template
- 擴展功能
- thinkjs 命令
- 靜態資源訪問
- Middleware
- Service
- Cookie
- 錯誤處理
- 錯誤信息
- 數據校驗
- 國際化
- 路徑常量
- REST API
- 定時任務
- 線上部署
- 推薦模塊
- API
- think
- think.base
- think.http.base
- http
- controller
- rest controller
- model
- model.mongo
- middleware