《node.js开发指南》观后感
by snoopyxdy
at 2012-08-24 10:06:48
original http://snoopyxdy.blog.163.com/blog/static/601174402012723103030678
var contents = querystring.stringify({
name: 'byvoid',
email: 'byvoid@byvoid.com',
address: 'Zijing 2#, Tsinghua University',
});
var options = {
host: 'www.byvoid.com',
path: '/application/node/post.php',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length' : contents.length
}
};
// 讀取 users 集合
db.collection('users', function(err, collection) {
if (err) {
mongodb.close();
return callback(err);
}
// 爲 name 屬性添加索引
collection.ensureIndex('name', {unique: true});
// 寫入 user 文檔
collection.insert(user, {safe: true}, function(err, user) {
mongodb.close();
callback(err, user);
});
});
简单分析下:var format = require('util').format;... ...function _flash(type, msg) {if (this.session === undefined) throw Error('req.flash() requires sessions');var msgs = this.session.flash = this.session.flash || {};if (type && msg) {// util.format is available in Node.js 0.6+if (arguments.length > 2 && format) {var args = Array.prototype.slice.call(arguments, 1);msg = format.apply(undefined, args);}return (msgs[type] = msgs[type] || []).push(msg);} else if (type) {var arr = msgs[type];delete msgs[type];return arr || [];} else {this.session.flash = {};return msgs;}}
作者直接使用 new Date()方法存放了时间。在数据库存放时间格式上一直很有争议,我个人一直是存时间戳的,原因有如下几个:function Post(username, post, time) {
this.user = username;
this.post = post;
if (time) {
this.time = time;
} else {
this.time = new Date();
}
};
如果应用的页面越来越多,这样的代码会越来越来长,如果你使用了 rrestjs 框架,情况就完全不一样了,我们看下使用rrestjs框架的实现app.get('/reg', checkNotLogin);
... ...
app.post('/reg', checkNotLogin);
... ...
app.post('/login', checkNotLogin);
... ...
app.get('/logout', checkLogin);
... ...
app.post('/post', checkLogin);
... ...
只需要在入口处判断哪些请求url需要验证登录即可全部搞定,无需重复的代码拷贝。var http = require('http'),
rrest = require('rrest'),
server = http.createServer(rrest(function (req, res) {
var noCheckUrl = ['index', 'other'];//rrestjs会默认把'/'认为'/index'
if(!~req.path[0].indexOf(noCheckUrl) && !isLogin(req, res)) return res.redirect('/login')
//normal routes
})).listen(rrest.config.listenPort);
最后要给作者提一下啊,书中第6页,node.js和php+nginx对比测试的数据我的名字打错 ,应该是snoopyxdy,而不是snoopyxd。而且测试的数据没有把硬件以及node,linux,php版本号以及网络环境等相关因素写进去,不够严谨。
另外关于nginx+node.js的小建议:
之前我曾经开4个node.js绑定4个CPU然后nginx开4个进程,绑定4个CPU,结果悲剧了,压测一直卡死,原来是node.js和nginx抢CPU造成的,后来楚汉分界,nginx用前2个CPU,而node.js拿后两个cpu。另外nginx也像汽车一样,要先热车,重启后先随便压测几次,然后过一会水温就上来了,就可以踩油门了,哈哈。