16年5月27日~28日,北京美团总部举办Hackathon,项目小结
不论比赛排名如何、能否拿到奖品,学到知识才是自己硬实力的提升


Database部分

VARCHAR, TEXT

VARCHAR(n): 存储在列元素中;可以作为索引
TEXT: 列元素中只保存一个指针,真实文本保存在另外的存储区域;不可作为索引

注:存储位置区别仅出现在MySQL上,对于InnoDB,如果VARCHAR类型的元素过长,内部仍然会使用TEXT形式的保存方案

实际应用中,要根据不同类型的输入,选择不同类型的格式

Type Case
VARCHAR(X) user name, email, country, subject, password
TEXT messages, emails, comments, formatted text, html, code, images, links
MEDIUMTEXT large json bodies, short to medium length books, csv strings
LONGTEXT textbooks, programs, years of logs files, harry potter and the goblet of fire, scientific research logging

Node部分

数据库连接

一个典型的SELECT请求写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 依赖mysql模块
var mysql = require('mysql');
// 创建连接,指定DB地址/用户名/密码/库名
var pool = mysql.createPool({
host: '10.4.232.53',
user: 'mock_user',
password: 'mock_user_pwd',
database: 'live_show'
});
// exports以将接口暴露在模块外
exports.queryComments = function (channelId, limit, callback) {
var select = 'SELECT `comment` FROM instant_comment where `channel_id` = \'' + channelId + '\' ORDER BY `id` DESC LIMIT ' + limit;
console.log("queryComments: " + select); // 建议每一次执行DB操作,都通过log记录下具体指令
pool.getConnection(function (err, conn) { // 请求一个连接
if (err) throw err; // js里通常的写法,回调函数中第一个参数是err
conn.query(select,
function (err, rows, fields) {
if (err) {
throw err;
} else {
callback(rows); // 回调函数处理row
}
conn.release(); // 注意!一定要在回调函数中释放连接,不然一旦进行10次(默认值)数据请求,就会导致连接打满而挂掉
});
});
};

http请求

一般写法是

1
2
3
4
5
6
7
8
// handler为回调函数
require('http').createServer(handler).listen(port);
// handler写法
function handler(req, resp) {
// do your business
resp.write('this is response');
resp.end();
}

其中 resp.write('foo') resp.end() 也可以简写为 resp.end('foo')

数据Json化

js中使用的是弱类型对象

1
2
3
4
var foo = {
code : 200,
msg : '成功'
}

对于这种对象,直接使用 resp.write(foo.toString()) 是无法返回数据的,拿到的其实是对象在内存中的指针。这里要用 JSON.stringify(foo).toString() 来生成结果。

1
resp.write(JSON.stringify(foo).toString());

静态资源

使用 express 框架,非常简单(@王善成 介绍说现在 koa 更为流行,待调研)。
通过形如 http://10.4.232.53:9528/live_1.jpg 的地址来获取静态资源(不需要拼接 public

1
2
3
4
require('express');
var app = express();
app.use(express.static('public')); // 项目目录下的public文件夹,即为静态文件目录
app.listen(9528);

定时任务

使用 setInterval(func, delay) 来执行周期任务,因为代码本身有运行时间,函数有调用时间,因此在时刻上并不会保证100%的精确,(如声明了3000ms,可能在2990时执行,也可能在3010时执行)

1
2
3
4
5
6
7
8
// 定时任务,关闭不在保活列表里的直播源
var livingPeriod = 10 * 1000; // 需要保活的直播,要在30s内调用保活接口
setInterval(function() {
console.log("living shows: " + livingShows);
dbHelper.killDeadShow(livingShows, function () {
livingShows = []; // clear
});
}, livingPeriod);

===Ending===