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

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 最近在当当网上买了一本《node.js开发指南》,从学习node.js到现在看的第一本中文教程,也算献出了自己处子之身啊,哈哈。前后大约花了4,5个小时通读了node.js部分,附录部分只是略过了,谈一下感想把。 1、本书的定位: 就像书中的前言部分所述,确实是针对node.js还未入门的初学者准备的,但是有一个前提,如果之前没写过像php等后端的语言读本书可能有点迷茫。所以本书的
最近在当当网上买了一本《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框架地址:/

最后希望大家多多支持中文的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也像汽车一样,要先热车,重启后先随便压测几次,然后过一会水温就上来了,就可以踩油门了,哈哈。

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
3月前
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(中)
Node.js Shell 脚本开发指南(中)
|
3月前
|
JavaScript 前端开发 Shell
Node.js Shell 脚本开发指南(上)
Node.js Shell 脚本开发指南(上)
|
3月前
|
JavaScript 前端开发 Unix
Node.js Shell 脚本开发指南(下)
Node.js Shell 脚本开发指南(下)
|
开发者 自然语言处理 数据格式
带你读《实用Bot开发指南:基于Node.js与Bot框架设计并构建聊天机器人》之三:语言理解智能服务
本书讲述机器人设计和实现背后的基本概念。每一章都建立在前面的主题之上,并且在适当的地方显示了实现这些概念的实际工作代码。通过选择一个代码编辑器,你可以开始体验创建智能、迷人和有用的机器人。本书将教你如何在Facebook Messenger和Slack等平台上创建自己的机器人,整合扩展API,并在云中应用人工智能和机器学习算法。在本书的最后,你将会有足够的信息通过你创建的机器人来接触成千上万的新用户。
|
自然语言处理 机器人 机器学习/深度学习
带你读《实用Bot开发指南:基于Node.js与Bot框架设计并构建聊天机器人》之二:聊天机器人与自然语言理解
本书讲述机器人设计和实现背后的基本概念。每一章都建立在前面的主题之上,并且在适当的地方显示了实现这些概念的实际工作代码。通过选择一个代码编辑器,你可以开始体验创建智能、迷人和有用的机器人。本书将教你如何在Facebook Messenger和Slack等平台上创建自己的机器人,整合扩展API,并在云中应用人工智能和机器学习算法。在本书的最后,你将会有足够的信息通过你创建的机器人来接触成千上万的新用户。
|
机器人 自然语言处理 开发者
带你读《实用Bot开发指南:基于Node.js与Bot框架设计并构建聊天机器人》之一:聊天机器人概述
本书讲述机器人设计和实现背后的基本概念。每一章都建立在前面的主题之上,并且在适当的地方显示了实现这些概念的实际工作代码。通过选择一个代码编辑器,你可以开始体验创建智能、迷人和有用的机器人。本书将教你如何在Facebook Messenger和Slack等平台上创建自己的机器人,整合扩展API,并在云中应用人工智能和机器学习算法。在本书的最后,你将会有足够的信息通过你创建的机器人来接触成千上万的新用户。
|
NoSQL 中间件 内存技术
使用Express3.0实现<Node.js开发指南>中的微博系统
特别说明:本实例仅在windows xp sp3系统下测试通过(其它系统未经过测试)。 这本书,之前有评论过,但之前并不清楚express2.x与3.x会有如此大的差异,导致在写例子的过程中痛苦不已。
930 0
|
JavaScript C++ Windows
关于《Node.js开发指南》
天天刷豆瓣,就盼着京东360有货到或者亚马逊有货到(最开始只有china-pub有货,但从亚马逊上下单要先付款RMB43.8--其中要多付10块钱的运费:(,京东RMB33.8但不知道什么时候有货)。
837 0
|
2月前
|
JSON JavaScript 前端开发
JS服务端技术—Node.js知识点
本篇文章是我开始系统学习Node.js的一些笔记。如果文中阐述不全或不对的,多多交流。
62 0
JS服务端技术—Node.js知识点
|
3月前
|
JavaScript
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
node下的two.js调用one.js出现无法编译问题 Cannot find module ‘c:
47 0