Tools


如何使用tools

在实际项目运营中, 开发者通常需要编写一些脚本, 用于解决运营中发生的一些问题, 如修正数据; 或者进行一些安全级别较高的操作, 如重置管理员密码, 清理数据等.
weroll提供了一种编写脚本的规范, 在weroll的模板项目中有一个 ./server/tools 目录, 用于存放开发者编写的脚本, 然后通过执行以下exec.js来执行脚本操作:

$ cd YOUR_APPLICATION_FOLDER
$ node exec.js your_script arg0 arg1 arg2

exec.js 是weroll模板项目中执行脚本文件的入口;
your_script 则是脚本的文件名(不需要写.js扩展名), 文件名后可以传入多个参数


假设我们编写了一个用于查询某一天注册用户数的脚本 ./server/tools/user_count.js

$ node exec.js user_count 20170128


exec.js将先加载 ./server/config/%ENV%/setting.js 里的配置数据, 如果配置有MongoDB或Redis,则建立相应的连接, 最后加载脚本文件, 开始执行里面的脚本内容.
默认exec.j会使用 localdev 环境下的配置文件, 如果需要使用其他的环境配置, 需要在exec.js之后加上-env参数, 如:

$ node exec.js -env=prod user_count 20170128



编写脚本

编写脚本需要遵循一些规范, 一个典型的脚本文件如下:

/* ./server/tools/your_script.js */
//node exec.js your_script arg0 arg1 arg2

exports.do = function(arg0, arg1, arg2) {
    /*
        sync jobs
    */
    //jobs done, exit
    process.done();

    /* or
    async_jobs(function() {
        //....
        //jobs done, exit
        process.done();
    });
    */
}

exports.do 方法即是脚本的入口, 方法的参数即是命令行执行脚本时传递的参数.
process.done([msg]) 会结束当前脚本进程, msg参数是可选的, 若不传递, 则控制台在进程结束前会输出”script is completed.”; 若传递msg参数, 则控制台在进程结束前输出该信息; 若msg是Error对象, 则控制台在进程结束前使用console.error输出该错误信息.

我们接着上面的示例, 开始编写一个用于查询注册用户数的脚本:

/* ./server/tools/user_count.js */

var Model = require("weroll/model/Model");

exports.do = function(date1, date2) {
    var filter = {};
    if (date1) {
        date1 = parseDate(date1);
        if (date2) {
            //user count in date1 ~ date2
            date2 = parseDate(date2);
            filter.createTime = {
                $gte:date1.getTime(),
                $lte:date2.getTime()
            };
        } else {
            //use count in date1
            filter.createTime = {
                $gte:date1.getTime(),
                $lte:date1.getTime() + 24 * 60 * 60 * 1000
            };
        }
    } else {
        //all user count
    }

    Model.DB.count("User", filter, function(err, count) {
        process.done(err ? err : `user count: ${count}`);
    });
}

function parseDate(date) {
    var year = date.substr(0, 4);
    var month = date.substr(4, 2);
    var day = date.substr(6, 2);
    return new Date(year, month, day, 0, 0, 0, 0);
}

然后我们来执行这个脚本, 查询数据库中的用户总数:

$ node exec.js user_count


或者加上2个时间参数, 查询这这个时间段内产生的用户数:

$ node exec.js user_count 20170128 20170130