精华 一个面向 Node.js 初学者的系列课程:node-lessons
发布于 4 年前 作者 alsotang 40645 次浏览 最后一次编辑是 2 年前 来自 分享

GitHub repo 地址:https://github.com/alsotang/node-lessons

如果大家认为漏了哪些初学者应会的内容,可以在此留言,或者开个 issue 给我(!!推荐)。


《Node.js 包教不包会》 – by alsotang

为何写作此课程

在 CNode(https://cnodejs.org/) 混了那么久,解答了不少 Node.js 初学者们的问题。回头想想,那些问题所需要的思路都不难,但大部分人由于练手机会少,所以在遇到问题的时候很无措。国内唯一一本排的上号的 Node.js 书是 @朴灵(https://github.com/JacksonTian) 的 《深入浅出Node.js》(http://book.douban.com/subject/25768396/ ),但这本书离实战还是比较远的。

这个课程是希望提供更多的 Node.js 实战机会,通过每一节精心安排的课程目标,让 Node.js 的初学者们可以循序渐进地,有目的有挑战地开展 Node.js 的学习。

更多 Node.js 入门资料请前往:https://cnodejs.org/getstart

课程列表

License

MIT

91 回复

我喜欢你的写作风格

[[[@leapon](/user/leapon)](/user/leapon)](/user/leapon) 原来你喜欢扯淡式风格

不错呀, 楼主继续哟, 将来就是一本书了

非常感谢,我会学的,我会学的,我会仔细仔细的学的。:D

屏幕快照 2014-10-07 23.58.26.png

太郁闷了,Lesson 0 就出问题了,让我 trying to update 但是我不知道怎么做,我尝试进入 ~/.nvm,再执行 install.sh 一样的结果。

略屌,先顶

@think2011 需要 source 一下,教程下面的答疑应该有涉及这方面。

@alsotang 哦,刚开始上手OS X,还不太明白。

Lesson 6 关于测试方面的内容很有帮助,期待后续的教程!

good job 太棒了

@songtanjichuan 还没写啊。。。

@think2011 nvm在安装完之后,会在profile文件里头添加上自己的export信息,在unix系统中,多个环境变量配置文件可能会互相冲突(优先级)。

如果你曾经装过例如homebrew等修改过环境变量的程序之后,可能会创建.bashrc文件,然后把环境变量写入到这个文件中。 但是nvm会将自己的信息添加到.profile中,unix默认设置下,如果有bashrc就不再加载profile了,所以你去把profile里头的东西复制到bashrc里头就行。

中心思想就是:mac下的nonlogin-shell和login=-shell的两个配置文件profile、bashrc是不共存的,除非你在其中一个配置文件中source了另一个配置文件,否则这两个配置文件只会有一个被执行,检查一下你的目录看看里头如果有多个配置文件就可能有问题了

(上述文件名啥的早就忘了可能会说错,意思就是这个意思)

@friskit-china @think2011 我在 .bash_profile 中 source 了 .profile

发 Mac 了好幸福 QAQ

@xadillax 来阿里照样有!

npm install superagent --save 出错 npm ERR! cb() never called!安装出错了

唉,格了正版window8,是时候装个centOS了!学起学起

WIN也可以安装NODE.JS呀

我自己写了个简单的爬虫,用到了cheerio,但是如果目标网页是非utf8的话,拿到的中文全是乱码,这个怎么解决呢?我没有用superagent,就是用的node的http.get,谢谢

@hwoarangzk 建议用 superagent 配合 superagentparse 使用。如果坚持使用 http.get 的话,concat buffer 的时候使用 bufferhelper,转换编码使用 iconv-lite

嗯,刚才用iconv的时候,没注意第一个参数必须是个buffer,我之前用的是字符串,怪不得一直不成功,后来改成用buffer就好了

进来从头再学一遍,教程真是简明扼要,收获不少啊~ 我就是在windows下开发node.js的哇,哈哈哈哈~

@snoopy 大神真看得起这种入门教程啊!看来以后要更认真对待了,同行 review 什么的最可怕了。

我猜楼主是搞java的

@adminparry 能不能猜我是搞 ruby 的谢谢!

mac吊炸天…

为啥win下没讲

@ychow win 下时不时有不兼容的问题,所以放弃了。

坐等mongo,实现自己的小想法。

这类的课程完全是浪费时间, 学javasript 入门一下 + 实战 + 加各类编程思想,程序设计书籍足矣。 不断实践、思考、改进,不断编码实现。 时间的积累,代码量的积累一上来,自然而然豁然开朗。

@liveinjs 好像也有点道理,呵呵

@liveinjs 不同意你的说法。对项目作者自己,是一个整理自身所学的过程,能够查漏补缺,增强理解。对于读者,一是step by step的教程有助于减少入门的挫折感,二是作为例程可以在自己的项目里复用,三是学习思路和一些模块的用法。同时作为公开项目,可以众包建设、可以不断改进。这种模式可以说是一石多鸟,必将大行其道,取代现有的计算机类书籍。 @alsotang 加油~

@pockry …至少我是喜欢这种做题的方式…

@alsotang 我也挺喜欢,看起来不太费劲,但是,小心,别把蛋扯碎了。。。。。。

BTW, BDD是不是也是TDD的一种? 查了不少资料,说BDD是TDD的变种,但是实际驱动开发的时候,是不是也和TDD一样,先写测试。只不过两者关注点不一样,是不是呀?

@soliury 对,关注点不一样,bdd 看问题的层面更高一点。tdd 被认为更倾向于测接口,而 bdd 被认为要模拟用户的行为来测试。

了解一下就好了。

@alsotang 嗯嗯。 那nodeclub的测试是BDD类型的?should.js好像就是BDD的断言库。

@soliury should.js 是 bdd 的类型库,assert 就比较像 tdd 的了。不过是哪种不重要,主要是测试用例覆盖齐不齐。

@liveinjs 整理这些课程也并不简单,每个人的基础不一样,学习方法也不一样,你不能用 “这类的课程完全是浪费时间” 一句话说写,也给自己留点余地,感谢 @alsotang 的分享

观众还是一边倒, @liveinjs 要加油了,看了一下你的repos, https://github.com/liveinjs/myfn abtest,js 视乎得改个名。 也不是找茬,纯粹好奇就过去瞄了一眼。 想说,贡献代码、文档是一件积极美好的事情,在否定美好的时候,请带来更美好的! 和@alsotang 私下沟通过,他不是要做21天精通node.js, 而是用node.js 来串讲web开发这件事。 教程还在不断完善中, talking or laughing is cheap, show me the code

死等Lesson 8: 《Mongodb 与 Mongoose 的使用》

@liuzhengming 额,这个lesson计划可能是我写,这么看来还是 @alsotang 来写比较好

@Ricardo-Li 你写,我帮你修订。

express 4.xx后变化很大,node 代码14年开始的代码简直全变化了,这可能是12年开始的node学习的一个分水岭阶段。

急需一个 express 4.xx +mysql 这种例子应用,哪里能找到呢

@gotolnc mysql 的使用没有什么特殊的地方啊,express 用好了就 ok 了。

@alsotang 现在网上全是express 4以前的例子,哪里有最新的例子想看一下,发现3的例子基本上不能运行

恩,不错,赞一个,希望noder越来越多

@songtanjichuan 写东西也累的啊…周末…

短小精悍,但是每章看起来都很充实!

好东西,找机会玩一下

@mexiQQ 一起来搞搞社区呗:)

  1. nodejs + mysql
  2. http(server和client)、request模块

把学生会的事情忙完一定好好跟你学,, 之前看的是教程是 这个 感觉你讲的更详细呢,好评

@noctiomg 都是好教程:)

用windows,第一课就卡住了:(

只要安装0.8.17版本,怎么还自动安装了1.2.0版本?

@gotolnc 之前都白学了,要重新学?

@fenode nvm ls-remote是什么? 不能直接nvm install v0.10.32么?

@alsotang https://github.com/alsotang/node-lessons/tree/master/lesson6 介绍一下istanbul的ignore语法会更全面一些,我觉得可以在:

其实这覆盖率是 100% 的,24 25 两行没法测。

这里展开讲解,我中文不行,就不提PR了 哈哈(我这也算半同行review了哈)

@yorkie 这个也太细节了吧

@alsotang 哈哈 我个人比较强迫症,但是“没法”两个字会给读者一种无能为力的赶脚,或者给个原文链接做拓展可好

@alsotang 你好,在学习到 Lesson 4: 《使用 eventproxy 控制并发》 ,有问题,

topicUrls.forEach(function (topicUrl) {

  console.log(topicUrl);

  superagent.get(topicUrl)
    .end(function (err, res) {
	
	
	console.log(topicUrl);
	
	
      console.log('fetch ' + topicUrl + ' successful');
      ep.emit('topic_html', [topicUrl, res.text]);
    });
});

发现这段代码
两个console.log(topicUrl); 出来的 url 不一样,导致 抓取的数据不对,

拥有一个能用的例子来供学习,这种感觉真是幸福(^o^)/~

课说得很清楚哦!很好懂。不过。 第五课有一些不是很明白。 var fetchUrl = function(url, callback){ var delay = parseInt((Math.random() * 10000000) % 2000, 10); concurrencyCount++; console.log(‘现在的并发数是’, concurrencyCount, ‘,正在抓取的是’, url, ‘,耗时’ + delay + ‘毫秒’)

setTimeout(function(){
	concurrencyCount--;
	callback(null, url + 'html content');
},delay)

} 定时器里的不是很明白。

@ihqn setTimeout用来模拟一个一步操作。

setTimeout(function(){
   //concurrencyCount是一个计数器,用来统计现在有多少个异步操作在执行。这里把计数器减一,是因为定时器到点了,那么模拟的这个异步操作就算是
   //执行完了,所以呢把这个计数器减掉一
    concurrencyCount--;
	//定时器到点,执行我们定义的回调函数。function(err,data),因为没有错误发生,所以将err设为null.
    callback(null, url + 'html content');
},delay)

@alsotang 汗,最近忙着找实习工作,今天刚刚安顿下来,好啊,你不嫌弃我渣的话

@mexiQQ 实习找到哪里了?

@mexiQQ 也在杭州啊

@alsotang 对啊对啊Y(^_^)Y约吗?

@alsotang 管理员,这回复该删了

做lesson4的练习时, error.jpg,使用url.resolve这个方法,提示参数必须为 字符串,但我这个确实字符串啊,求教什么原因啊

@i5ting 太监了。。。

还不错,先收录了 自豪地采用 CNodeJS ionic

#你的计划呢 三年了

@iceonion 放弃了。。。

@alsotang 男人 怎么可以随随便便就放弃呢 雄起。。雄起。。雄起

谢谢楼主
☆ 来自微信小程序 cnode助手

☆ 来自微信小程序 cnode助手

谢谢
☆ 来自微信小程序 cnode助手

@alsotang 请教,做lesson4的挑战题取积分的时候,遇到一个难点,不知道怎样用superagent里面取到的变量取修改外面的全局变量,代码(部分)如下:

    var topicUrl = topicPair[0];
    var topicHtml = topicPair[1];
    var $ = cheerio.load(topicHtml);
	//取评论人的积分
	 var authorUrl = url.resolve(cnodeUrl,$('.dark.reply_author').eq(0).attr('href'));
	 let score1 =0;
	 superagent.get(authorUrl)
	 .end(function (err, sres) {
	 	// 常规的错误处理
	 	if (err) {
	 	return next(err);
	 	}
	  const $2 = cheerio.load(sres.text);
	  score1 = $2('.unstyled .big').eq(0).text().trim();
	  console.log("In ,score1:"+score1);		  
	})
	return ({
      title: $('.topic_full_title').text().trim(),
      href: topicUrl,
      comment1: $('.reply_content').eq(0).text().trim(),
	  author1: $('.dark.reply_author').eq(0).text().trim(),
	  score1: score1
    });
	superagent里面的score1已经取到积分了,但没办法传出来。。。谢谢
回到顶部