《node.js开发指南》观后感

最近在当当网上买了一本《node.js开发指南》,从学习node.js到现在看的第一本中文教程,也算献出了自己处子之身啊,哈哈。前后大约花了4,5个小时通读了node.js部分,附录部分只是略过了,谈一下感想把。

1、本书的定位:

就像书中的前言部分所述,确实是针对node.js还未入门的初学者准备的,但是有一个前提,如果之前没写过像php等后端的语言读本书可能有点迷茫。所以本书的定位人群应该是对后端脚本语言有过一定开发经验,并且熟悉javascript语法的人。

2、本书的组成部分:

个人感觉分为3块,前面一大部分是node.js介绍安装,中间一块和最后node.js的核心API介绍和热门模块,最后是一个简单的微博web应用,主要介绍了模板和mongodb的增删改查。个人感觉前面node.js安装和介绍有点多,而实际应用有点少。

3、总体感觉:

本书内容很丰富,很多知识面都谈到了,但是不够深入,真的很适合初学者。API的介绍也不够详细,仅仅介绍了几个主要的,比如cluster模块的多进程通信、buffer模块的深度应用事例以及net模块的TCP/IP服务器都没有深入。至少是第一本中文的node.js教程,希望大家多多支持啦。

4、个人感觉书中有不妥的地方,列举几处,希望作者能够在改版中参考下,代表个人意见哦,可能说的不对。

A)书中75页,httprequest.js,期中代码片如下:


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
}
};

大家注意这个contents.length,当contents都是英文及半角符号时没有问题,但是如果有中文,这样计算 Content-Length
会出现问题,应改为:Buffer.byteLength(contents,
'utf8')

当然这里作者使用了querystring.stringify 方法,能够自动将中文转义,所以不存在这个问题,这里可能是个小坑,要注意哦

B)书中第115页,代码片段如下:


// 讀取 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);
});
});

这边我感觉是作者的一个失误,因为这个代码片段属于User.prototype.save,是用户注册执行的方法。这里每注册一个用户就为集合users建立一次name的唯一索引实在欠妥,应该在app启动时初始化对数据库建立索引,并且应该先判断索引是否已经存在,而不必每次插入数据库创建一遍索引。

C)同样是上面的一段代码,我们看期中绿色部分

大家注意到了{safe:true}这个设置了吧,作者没有说明这个{safe:true}的含义,我在这边简单介绍下。

1、不加{safe:true}表示我们mongodb客户端向数据库抛出这句insert语句后,立刻执行回调函数,而不去关心是否真的插入成功,类似往河里扔石头,扔了就告诉妈妈,我扔石头了。

2、加上{safe:true}表示mongodb数据库已经成功执行这条insert语句,并且插入完成或者报错后执行回调函数,类似往河里扔石头,看见水花起来了,或者不小心砸到河上的船了,然后告诉妈妈。

D)书中114页,这样写到:

req.flash是express提供的一个奇妙的工具,通过它保存的变量只会在用户当前和下次的请求中被访问... ....

作者如此描述,感觉req.flash很厉害,瞬间让我产生了好奇,因为当初我写 rrestjs 框架时借鉴了很多expressjs的源代码,并没有发现有req.flash,翻看expressjs3.0的源码发现没有req.flash的方法,于是在connect-flash模块中找到了它,贴下它的源码:



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;

  }

}

简单分析下:

如果没有开启session功能,则直接抛出异常,也就是说这个req.flash是存放在session里的,所以并没有像作者写的那么神奇,顿时很失落。1.如果type和msg都传参了,如果参数长度大于2,则执行format函数将msg字符串处理一下。然后往msgs[type]数组中插入msg字符串。

2.如果只有一个参数,则删除这个msgs[type],返回改数组,这里就是作者说的一次性的关键。

3.清空msgs对象,返回整个msgs对象。

其实这个函数还是很巧妙的,保证了req.flash的一次性使用,节能环保,呵呵,当然没有作者说的那样神奇啦。

E)书中第124页,代码片段如下:


function Post(username, post, time) {
this.user = username;
this.post = post;
if (time) {
this.time = time;
} else {
this.time = new Date();
}
};

作者直接使用 new Date()方法存放了时间。在数据库存放时间格式上一直很有争议,我个人一直是存时间戳的,原因有如下几个:

1.存储空间的节约,时间戳要比格林威治时间存储空间更小

2.便于比较和排序

3.如果有其他语言比如php也要共享这部分数据,只需要把js生成的时间戳除以1000既可以转化为时间格式了,php的time()返回是以秒为单位的时间戳。

所以建议这边作者改为 Date.now()

最后当然是广告时间了:

看到作者为了判断除了首页,其他页面都需要用户登录写了如下代码片段:


app.get('/reg', checkNotLogin);

... ...

app.post('/reg', checkNotLogin);

... ...

app.post('/login', checkNotLogin);

... ...

app.get('/logout', checkLogin);

... ...

app.post('/post', checkLogin);

... ...

如果应用的页面越来越多,这样的代码会越来越来长,如果你使用了 rrestjs 框架,情况就完全不一样了,我们看下使用rrestjs框架的实现

我们看下代码片段:


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);

只需要在入口处判断哪些请求url需要验证登录即可全部搞定,无需重复的代码拷贝。

rrestjs框架地址:http://www.rrestjs.com/

最后希望大家多多支持中文的node.js教程,都去买正版书籍把,《node.js开发指南》真是一本难得中文node.js好教材!推荐一个

最后要给作者提一下啊,书中第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也像汽车一样,要先热车,重启后先随便压测几次,然后过一会水温就上来了,就可以踩油门了,哈哈。

时间: 2024-09-21 10:30:39

《node.js开发指南》观后感的相关文章

《钢的琴》观后感

接连看了四部电影,周六不上班就是给力. 这部电影,喜剧开场,悲剧穿插,结尾引人入胜的同时带来了一个疑问.遂百度之.发现有两种解释. 钢的琴里面的淑娴,有一段拦着桂林不让桂林进屋,桂林怀疑是隔壁老王在里面,想强进去看,结果淑娴拉住,不让进,说有事明天说.到第二天,抗美骑着自行车带着淑娴去钢厂,淑娴特意在大门口之前的那段路下来,并四处张望,怕被人看到.作为二十多岁的小伙子我来说,我着实猜不到昨天晚上到底抗美和淑娴上没上床,因为自已既然入戏,感觉桂林这个主人公不能白白的吃亏啊!!而且最后的结局是桂林说

秦海璐悉尼获嘉奖《钢的琴》海外再传捷报

近日,秦海璐作为出品人和女主角携带电影<钢的琴>亮相澳大利亚悉尼,参加在此举办的第三届中国电影节.此次电影节将评委会特别推荐奖授予电影<钢的琴>,秦海璐现身悉尼领奖.[page] <钢的琴>夺评委会大奖 出品人秦海璐收获满满电影<钢的琴>由郭在容担任监制,新锐导演张猛执导,汇聚了秦海璐.王千源等实力派影星.早在<钢的琴>筹备之时,就引起威尼斯电影节主席马可·穆勒的注意,该片自多伦多电影节中的世界首映大放异彩之后,已得到超过二十个国际电影节的邀请和

秦海璐悉尼获嘉奖《钢的琴》海外再传捷报(图)

<钢的琴>夺海外大奖 秦海璐和王千源 秦海璐大秀乳沟 秦海璐微笑 秦海璐在悉尼街头 秦海璐除夕活动(点击小图看大图)点击此处查看其它图片 新浪娱乐讯 近日,秦海璐作为出品人和女主角携带电影<钢的琴>亮相澳大利亚悉尼,参加在此举办的 第三届中国电影节.此次电影节将评委会特别推荐奖授予电影<钢的琴>,秦海璐现身悉尼领奖. <钢的琴>夺评委会大奖出品人秦海璐收获满满 电影<钢的琴>由郭在容担任监制,新锐导演张猛执导,汇聚了秦海璐.王千源等实力派影星.早

一位小学生的《夜宴》观后感_经典网摘

一位小学生的<夜宴>观后感     昨天晚上,我们排着整齐的队伍来到电影院观看了电影<夜宴>.电影票好贵哟,不过老师说,能够看到章子怡阿姨光溜溜的背影,再贵也是值得的.     许多同学都不明白什么叫"夜宴",我的语文功底比较好,于是就告诉他们"夜宴"其实就是"晚饭"的意思.只不过穷人的"晚饭"是"晚饭",而有钱人的"晚饭"叫"夜宴".    

电影《杀破狼二》观后感

电影<杀破狼二>观后感 端午节小长假期间,去电影院观看了吴京,任达华,托尼贾,张晋等主演的动作警匪片<杀破狼2>.相比第一部电影,杀破狼二在情节上并无任何延续性和关联性,只是一部香港风格的警匪片,动作片而已.此部电影,阐述了人间诸多情感:托尼贾和萝莉饰演的泰国狱警猜的浓浓父女情,任达华和吴京的叔侄情,以及古天乐恭硕良饰演的灰色兄弟情等等,揭示了人间的美好与邪恶. 武打演员吴京出道已超过十年,从之前的配角到现在的首席主演,已经实现了其艺人生涯的华丽转身和蜕变.近十年,吴京很是勤奋,从

《阿尔卑斯》观后感

    今天是黄金周第六天,发现得收一下心了,一天基本都在家里,一来是昨天外出运动量也不小,今天早起就格外的困和累,二来是马上就要上班了,似乎家里还是得收拾一下,还有一个原因是天气不大好,看预报是要下中雨的,晚上终于下起来了.其实很多事情都是理由,要想成,怎么说都成,要不看好,怎么都是缺点和不如意.     今天就给大家分享下<阿尔卑斯>的观后感吧.     昨天晚上收拾完之后,脑海中还在闪现着科技馆中进门时看到的一个海报<阿尔卑斯>,几年前就看过这部人与大自然搏斗的故事,看完之后

软文博客分析:莫湘兆软文博客观后感

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天需找一些软文写作技巧来学习,有幸在百度搜索"软文"进入了一个博客,说来也是很奇怪,一个软文博客优化效果怎么那么好呢,在软文关键词下唯独只有一个是独立博客的,不得不让我佩服他,虽然软文这个词没有SEO那么火,但是能够有这样的一个博客出现在首页,是相当的不错的.可见博主是非常的不错啊,很厉害的一个人,网站内容也不是很多,内

期待我的西行之旅--后会无期观后感

        撺掇着几个同事一起去看的韩寒的<后会无期>,趁着老板不在,偷偷下楼去电影院买了八张后会无期的影票.前面四张座位的影票给了前端技术,后面四张座位的影票给了后端技术! 因为大家都说韩寒是80后的代表,我想是不是代表我们80后的韩寒能拍一部引起我们共鸣的电影呢.还好还好,电影没有让我失望! 电影院大概每五分钟就会爆发一次哄堂大笑,随时都有一些零星的笑声,可能大家的笑点不一样吧!当汽车从东极岛出发,向着西部出发,在广袤的大地上穿行,就注定这部影片是部公路题材的电影了.大大咧咧的王珞丹饰

荣超案例分析:肖俊SEO博客观后感

本人今日有幸观察了一下,做广州SEO但是长沙SEO排名第一的博客.该博客博主确实很厉害,网站的内容相当丰富,并且每篇文章的内链优化都做的十分优秀.每篇文章的评论都有很多很多,这样火的博客,确实值得我们借鉴,那么笔者今天就和大家分享一下,笔者对该博客的看法. 肖俊博客其实很早就有看到过他的排名很好,但是没有去看过他的博客,因为是同行,但是没有具体去分析.今天进入一看发现原来这个网站的内容作得是那么的优秀,确实让人叹为观止.笔者现在就总结一下该博客的优势在哪. 1.丰富的内容:该博客想必已经做了4-