Online projects often need to be timed to execute certain function. By this time, you can use crontab. ThinkJS supports command line calls, combined with the system's crontab function, let you perfectly achieve this type of task.
Besides supporting URL access, ThinkJS also supports command line calls. The usage is as follows.
node www/production.js home/index/index
The above command means to execute indexAction of index Controller in home module.
If you need to add some params, just put the corresponding params at the end of the line:
node www/production.js home/index/index?name=thinkjs
In Action, you can use method this.get to get param name.
In command line executation, the default request type is GET. If you wand to modify it to use other type, you can do it this way:
node www/production.js url=home/index/index&method=post
Thus, the request type is changed to post. But in this way, the value of params in url can not includ "&" anymore (but you can use "/" to specify params, such as node www/production.js url=home/index/index/foo/bar&method=post).
Besides modifying request type, you can also modify the following params.
host modify the request host, default is 127.0.0.1ip modify request ip, default is 127.0.0.1Sometimes, if you want to modify more headers, you can pass a complete json. eg.
node www/production.js {"url":"/index/index","ip":"127.0.0.1","method":"POST","headers":{"xxx":"yyyy"}}
By default, you can access Action that is executed in command line by URL. If forbid URL to access to the Action, you can use think.cli to judge. eg.
export default class extends think.controller.base {
indexAction(){
// forbid URL access to the Action
if(!think.cli){
this.fail('only invoked in cli mode');
}
...
}
}
You can create a simple executable script to call command line to execute. eg.
cd project_path;
node www/production.js home/index/index;
This would create the directory crontab in the project, and put the above executable script as a file in this directory.
Using system crontab can do timed executaion. Use command crontab -e to edit crontab. eg.
0 */1 * * * /bin/sh project_path/crontab/a.sh # execute once per 1 hour
Besides combining crontab with command line, you can also use node-crontab module to execute crontab. eg.
import crontab from 'node-crontab';
// execute once per 1 hour
let jobId = crontab.scheduleJob('0 */1 * * *', () => {
think.http('/home/image/spider', true); //visit /home/image/spier
});
Put the above code file in direcotry src/common/bootstrap, so it can be executed automatically when server startup.