本项目实例代码: https://github.com/js-cool/up.js.cool
输出:
输入:
数据库采用MySQL
,缓存采用Redis
。
CREATE TABLE `data` (
`user` char(16) NOT NULL DEFAULT '' COMMENT '用户',
`active` int(3) unsigned NOT NULL COMMENT '活跃时间(秒)',
`efficiency` decimal(5,2) NOT NULL COMMENT '效率(%)',
`date` int(10) unsigned NOT NULL COMMENT '数据时间(转时间戳)',
KEY `whereorder` (`user`,`date`),
KEY `date` (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
up:data:username
up:latest:username
yarn init
yarn add --dev eslint eslint-config-airbnb eslint-plugin-jsx-a11y eslint-plugin-react eslint-plugin-import
配置ESLint
config/index.js
:
const ENV = process.env.NODE_ENV || 'dev';
const users = require(`./users.${ENV}`);
const {redis, mysql, cdn} = require(`./server.${ENV}`);
module.exports = {
cdn,
users,
redis,
mysql
};
可以用lazyload
方式动态加载:
const ENV = process.env.NODE_ENV || 'dev';
module.exports = (config) => (() => require(`./${config}.${ENV}`))();
考虑到本项目已经在实施过程中,变更改动较大,未修改。
crontab/crab.js
片段业务中插入操作尽可能精简,参数最好统一,像这样的方式调用:
data.rows.forEach(async (item) => {
if (operator) {
// 插入数据
await dataAdd(user, item);
} else if (item[0] === last[0]) {
operator = true;
if (item[1] !== last[1]) {
// 更新最后一条数据
await dataUpdate(user, item);
}
}
});
model/data.js
片段:
const { pool, format } = require('wulian-mysql');
const { mysql: mysqlOptions } = require('../config');
const { isEmpty } = require('../lib');
const DB = mysqlOptions.database;
const TABLENAME = `${DB}.data`;
exports.dataAdd = async (user, [date, active, , , efficiency]) => {
const mysql = await pool(mysqlOptions);
const sql = format('INSERT INTO ?? (user,active,efficiency,date) VALUES (?,?,?,?)',
[TABLENAME, user, active, efficiency, parseInt(new Date(date) / 1000, 10)]);
const result = await mysql.query(sql);
mysql.release();
return isEmpty(result) ? -1 : result.affectedRows;
};
exports.dataUpdate = async (user, [date, active,,, efficiency]) => {
const mysql = await pool(mysqlOptions);
const sql = format('UPDATE ?? SET active = ?, efficiency = ? WHERE user = ? AND date = ?',
[TABLENAME, active, efficiency, user, parseInt(new Date(date) / 1000, 10)]);
const result = await mysql.query(sql);
mysql.release();
return isEmpty(result) ? -1 : result.affectedRows;
};
这里主要用的是结构赋值新特性。
练手项目,测试阶段暂时忽略。有时间了再来补上。
pm2 start up.config.js
注意 PM2 版本使用大于 2.4,Node 版本大于 7.6.0。