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
课程列表
- Lesson 0: 《搭建 Node.js 开发环境》
- Lesson 1: 《一个最简单的 express 应用》
- Lesson 2: 《学习使用外部模块》
- Lesson 3: 《使用 superagent 与 cheerio 完成简单爬虫》
- Lesson 4: 《使用 eventproxy 控制并发》
- Lesson 5: 《使用 async 控制并发》
- Lesson 6: 《测试用例:mocha,should,istanbul》
- Lesson 7: 《测试用例:supertest》
- Lesson 8: 《Mongodb 与 Mongoose 的使用》
- Lesson 9: 《一个简单的 blog》
License
MIT
@think2011 nvm在安装完之后,会在profile文件里头添加上自己的export信息,在unix系统中,多个环境变量配置文件可能会互相冲突(优先级)。
如果你曾经装过例如homebrew等修改过环境变量的程序之后,可能会创建.bashrc文件,然后把环境变量写入到这个文件中。 但是nvm会将自己的信息添加到.profile中,unix默认设置下,如果有bashrc就不再加载profile了,所以你去把profile里头的东西复制到bashrc里头就行。
中心思想就是:mac下的nonlogin-shell和login=-shell的两个配置文件profile、bashrc是不共存的,除非你在其中一个配置文件中source了另一个配置文件,否则这两个配置文件只会有一个被执行,检查一下你的目录看看里头如果有多个配置文件就可能有问题了
(上述文件名啥的早就忘了可能会说错,意思就是这个意思)
@hwoarangzk 建议用 superagent 配合 superagentparse 使用。如果坚持使用 http.get 的话,concat buffer 的时候使用 bufferhelper,转换编码使用 iconv-lite
@alsotang 我也挺喜欢,看起来不太费劲,但是,小心,别把蛋扯碎了。。。。。。
BTW, BDD是不是也是TDD的一种? 查了不少资料,说BDD是TDD的变种,但是实际驱动开发的时候,是不是也和TDD一样,先写测试。只不过两者关注点不一样,是不是呀?
观众还是一边倒, @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
@alsotang https://github.com/alsotang/node-lessons/tree/master/lesson6 介绍一下istanbul
的ignore语法会更全面一些,我觉得可以在:
其实这覆盖率是 100% 的,24 25 两行没法测。
这里展开讲解,我中文不行,就不提PR了 哈哈(我这也算半同行review了哈)
@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 不一样,导致 抓取的数据不对,
课说得很清楚哦!很好懂。不过。 第五课有一些不是很明白。 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)