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
我喜欢你的写作风格
[[[@leapon](/user/leapon)](/user/leapon)](/user/leapon) 原来你喜欢扯淡式风格
不错呀, 楼主继续哟, 将来就是一本书了
非常感谢,我会学的,我会学的,我会仔细仔细的学的。:D
太郁闷了,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!安装出错了
nice
唉,格了正版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 好像也有点道理,呵呵
@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 要加油了,看了一下你的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 了。
@Ricardo-Li 期待,期待…
@alsotang 现在网上全是express 4以前的例子,哪里有最新的例子想看一下,发现3的例子基本上不能运行
恩,不错,赞一个,希望noder越来越多
@songtanjichuan 写东西也累的啊…周末…
@klamtlne 学习啦
短小精悍,但是每章看起来都很充实!
好东西,找机会玩一下
@mexiQQ 一起来搞搞社区呗:)
- nodejs + mysql
- 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 实习找到哪里了?
@alsotang segmentFault
@mexiQQ 也在杭州啊
@alsotang 对啊对啊Y(^_^)Y约吗?
@mexiQQ … @Ricardo-Li 举报
@alsotang 管理员,这回复该删了
做lesson4的练习时, ,使用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已经取到积分了,但没办法传出来。。。谢谢
mark ,收藏
@magicdawn win也不错
@alsotang 同志,能帮我解封一个账户不
@1103132201 闫春阳?九江学院?
写得很好
写得很好
写得很好
写得很好