Skip to content

Commit 3685398

Browse files
author
xiaolongXL
committed
Merge branch 'master' of github.com:nodeonly/nodejs-tutorial
2 parents 244aa91 + 95bf8ca commit 3685398

8 files changed

Lines changed: 144 additions & 2 deletions

File tree

doc/day1_express.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,7 @@ node-inspector是通过websocket方式来转向debug输入输出的。因此,
785785

786786
- nginx
787787
- haproxy
788+
788789
## 压力测试
789790
### ab
790791

doc/day2_mongodb.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,28 @@ http://docs.mongodb.org/manual/core/crud-introduction/
195195
http://mongoosejs.com/docs/
196196

197197
http://www.tuicool.com/articles/ZVbYra
198+
199+
### 文档
200+
201+
Find the API docs [here](http://mongoosejs.com/docs/api.html), generated using [dox](http://github.com/visionmedia/dox).
202+
203+
cd到node_modules/mongoose里
204+
205+
```
206+
npm install
207+
node static.js
208+
```
209+
210+
这样就可以再本地看mongoose的api了
211+
212+
### 例子
213+
214+
每个例子都不错,必须熟悉
215+
216+
![](./images/mongoose.png)
217+
218+
node modules的好处是可以随时看到代码,是不是很爽啊?
219+
198220
## 高级
199221

200222
- gridfs

doc/day3_node.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,3 +187,4 @@ other
187187
- [node.js API文档]( http://cnodejs.org/api/)
188188
- [npm依赖管理工具(node 中的RubyGems)]( http://npmjs.org/)
189189
- [Node Cloud(全面的node.js资料库)](http://www.nodecloud.org/)
190+
- [node.js中文资料导航](https://github.com/youyudehexie/node123)

doc/day5_test.md

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,49 @@
1010
### db
1111
### http
1212

13+
```js
14+
var assert = require('chai').assert;
15+
var expect = require('chai').expect;
16+
require('chai').should();
17+
18+
var Utils = require('../index');
19+
20+
console.log(Utils)
21+
22+
var request = require('supertest')
23+
, express = require('express');
24+
25+
26+
describe('Utils.req', function(){
27+
describe('#get_value_from_body()', function(){
28+
it('should return Manny when get_value_from_body with key name', function(done){
29+
30+
var app = express();
31+
32+
app.post('/user', function(req, res){
33+
// mock req.body data
34+
req.body = { 'name': 'Manny', 'species': 'cat' };
35+
36+
var Manny = Utils.req.get_value_from_body(req, 'name');
37+
assert.equal(Manny, 'Manny');
38+
39+
var species = Utils.req.get_value_from_body(req, 'species');
40+
assert.equal(species, 'cat');
41+
42+
done();
43+
});
44+
45+
request(app)
46+
.post('/user')
47+
.set('contentType', 'application/x-www-form-urlencoded; charset=utf-8')
48+
.end(function(err, res){
49+
if (err) throw err;
50+
});
51+
52+
})
53+
})//end
54+
})
55+
```
1356

1457
## 了解supertest
1558

doc/demo/day1/.DS_Store

-6 KB
Binary file not shown.

doc/images/mongoose.png

114 KB
Loading

doc/preview/day1_express.html

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,10 +780,56 @@ <h2>调试</h2>
780780

781781
<h3>node debug</h3>
782782

783+
<p>V8 提供了一个强大的调试器,可以通过 TCP 协议从外部访问。Nodejs提供了一个内建调试器来帮助开发者调试应用程序。想要开启调试器我们需要在代码中加入debugger标签,当Nodejs执行到debugger标签时会自动暂停(debugger标签相当于在代码中开启一个断点)。代码如下:</p>
784+
785+
<p>see <code>demo/day1/debug/app_debug1.js</code></p>
786+
<div class="highlight"><pre><span class="n">var</span> <span class="n">express</span> <span class="o">=</span> <span class="n">require</span><span class="p">(</span><span class="c">&#39;express&#39;);</span>
787+
<span class="n">var</span> <span class="n">app</span> <span class="o">=</span> <span class="n">express</span><span class="p">()</span><span class="err">;</span>
788+
789+
<span class="n">app</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="c">&#39;/&#39;,function(req,res){</span>
790+
<span class="n">debugger</span><span class="err">;</span>
791+
<span class="n">res</span><span class="p">.</span><span class="n">send</span><span class="p">(</span><span class="c">&#39;hello,world&#39;);</span>
792+
<span class="p">})</span><span class="err">;</span>
793+
794+
795+
<span class="n">app</span><span class="p">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">5005</span><span class="p">)</span><span class="err">;</span>
796+
797+
<span class="n">module</span><span class="p">.</span><span class="n">exports</span> <span class="o">=</span> <span class="n">app</span><span class="err">;</span>
798+
</pre></div>
799+
<p>执行命令:<code>node debug app_debug1.js</code> 就可以进入调试模式。</p>
800+
801+
<p>当然,首先需要在程序代码中手动添加中断debugger; , 这样当以调试模式运行时,程序会自动中断,然后等候你调试,就像GDB一样,可以用help命令查看自己都可以使用哪些调试命令。</p>
802+
<div class="highlight"><pre><span class="vg">debug</span><span class="o">&gt;</span><span class="w"> </span><span class="vg">help</span>
803+
<span class="nl">Commands:</span><span class="w"> </span><span class="vg">run</span><span class="w"> </span><span class="p">(</span><span class="vg">r</span><span class="p">),</span><span class="w"> </span><span class="vg">cont</span><span class="w"> </span><span class="p">(</span><span class="vg">c</span><span class="p">),</span><span class="w"> </span><span class="vg">next</span><span class="w"> </span><span class="p">(</span><span class="vg">n</span><span class="p">),</span><span class="w"> </span><span class="vg">step</span><span class="w"> </span><span class="p">(</span><span class="vg">s</span><span class="p">),</span><span class="w"> </span><span class="vg">out</span><span class="w"> </span><span class="p">(</span><span class="vg">o</span><span class="p">),</span><span class="w"> </span><span class="vg">backtrace</span><span class="w"> </span><span class="p">(</span><span class="vg">bt</span><span class="p">),</span><span class="w"> </span><span class="vg">setBreakpoint</span><span class="w"> </span><span class="p">(</span><span class="vg">sb</span><span class="p">),</span><span class="w"> </span><span class="vg">clearBreakpoint</span><span class="w"> </span><span class="p">(</span><span class="vg">cb</span><span class="p">),</span>
804+
<span class="vg">watch</span><span class="p">,</span><span class="w"> </span><span class="vg">unwatch</span><span class="p">,</span><span class="w"> </span><span class="vg">watchers</span><span class="p">,</span><span class="w"> </span><span class="vg">repl</span><span class="p">,</span><span class="w"> </span><span class="vg">restart</span><span class="p">,</span><span class="w"> </span><span class="vg">kill</span><span class="p">,</span><span class="w"> </span><span class="vg">list</span><span class="p">,</span><span class="w"> </span><span class="vg">scripts</span><span class="p">,</span><span class="w"> </span><span class="vg">breakOnException</span><span class="p">,</span><span class="w"> </span><span class="vg">breakpoints</span><span class="p">,</span><span class="w"> </span><span class="vg">version</span>
805+
</pre></div>
806+
<p>这里就和gdb等调试器一模一样了</p>
807+
808+
<p>注意,如果出现</p>
809+
<div class="highlight"><pre><span class="o">&lt;</span><span class="w"> </span><span class="vg">Failed</span><span class="w"> </span><span class="vg">to</span><span class="w"> </span><span class="vg">open</span><span class="w"> </span><span class="vg">socket</span><span class="w"> </span><span class="vg">on</span><span class="w"> </span><span class="vg">port</span><span class="w"> </span><span class="il">5858</span><span class="p">,</span><span class="w"> </span><span class="vg">waiting</span><span class="w"> </span><span class="il">1000</span><span class="w"> </span><span class="vg">ms</span><span class="w"> </span><span class="vg">before</span><span class="w"> </span><span class="vg">retrying</span>
810+
</pre></div>
811+
<p>请结束掉所有debug进程</p>
812+
<div class="highlight"><pre><span class="vg">ps</span><span class="w"> </span><span class="o">-</span><span class="vg">ef</span><span class="o">|</span><span class="vg">grep</span><span class="w"> </span><span class="vg">debug</span><span class="o">-</span><span class="vg">brk</span><span class="o">|</span><span class="vg">awk</span><span class="w"> </span><span class="c1">&#39;{print $2}&#39;|xargs kill -9</span>
813+
</pre></div>
783814
<h3>node-inspector</h3>
784-
<div class="highlight"><pre><span class="vg">node</span><span class="o">-</span><span class="vg">debug</span><span class="w"> </span><span class="vg">app</span><span class="o">.</span><span class="vg">js</span><span class="w"> </span>
815+
816+
<p>上面这种方式稍微有些麻烦,我们写JS代码调试的时候一般都用FireBug或谷歌浏览器内置的调试工具,nodejs程序当然也可以这样子来调试,但是首先需要安装一个node-inspector的东西</p>
817+
818+
<p>node-inspector是通过websocket方式来转向debug输入输出的。因此,我们在调试前要先启动node-inspector来监听Nodejs的debug调试端口。</p>
819+
820+
<p>这个需要用npm来安装,只需要执行下列语句:</p>
821+
<div class="highlight"><pre><span class="vg">npm</span><span class="w"> </span><span class="vg">install</span><span class="w"> </span><span class="o">-</span><span class="vg">g</span><span class="w"> </span><span class="vg">node</span><span class="o">-</span><span class="vg">inspector</span>
822+
</pre></div>
823+
<p>安装完成之后,通常可以直接这样启动在后台:</p>
824+
<div class="highlight"><pre><span class="vg">node</span><span class="o">-</span><span class="vg">inspector</span><span class="w"> </span><span class="o">&amp;</span>
785825
</pre></div>
786-
<p>然后会在浏览器里打开一个页面</p>
826+
<p>默认会监听8080端口,当然,也可能通过使用--web-port参数来修改。然后,在执行node程序的时候,多加个参数:--debug-brk, 如下:</p>
827+
<div class="highlight"><pre><span class="vg">node</span><span class="w"> </span><span class="o">--</span><span class="vg">debug</span><span class="o">-</span><span class="vg">brk</span><span class="w"> </span><span class="vg">app</span><span class="o">.</span><span class="vg">js</span>
828+
</pre></div>
829+
<p>或者</p>
830+
<div class="highlight"><pre><span class="vg">node</span><span class="o">-</span><span class="vg">debug</span><span class="w"> </span><span class="vg">app</span><span class="o">.</span><span class="vg">js</span>
831+
</pre></div>
832+
<p>控制台会返回“debugger listening on port 5858”, 现在打开浏览嚣,访问http://localhost:8080,这时候就会打开一个很像Chrome内置调试工具的界面,并且代码断点在第一行,下面就可以使用这个来调试了。</p>
787833

788834
<p><img src="./images/debug.png" alt=""></p>
789835

@@ -794,6 +840,8 @@ <h3>node-inspector</h3>
794840

795841
<p>使用方法和chrome的inspect element调试web开发是一样的。</p>
796842

843+
<p>调试还是很方便的,而且可以异地调试。</p>
844+
797845
<h2>部署实战</h2>
798846

799847
<h3>开发环境下</h3>
@@ -811,6 +859,33 @@ <h3>集群与负载</h3>
811859
<li>haproxy</li>
812860
</ul>
813861

862+
<h2>压力测试</h2>
863+
864+
<h3>ab</h3>
865+
866+
<p>ab是apache自带的一个很好用的压力测试工具,当安装完apache的时候,就可以在bin下面找到ab</p>
867+
<div class="highlight"><pre><span class="vg">ab</span><span class="w"> </span><span class="o">-</span><span class="vg">n1000</span><span class="w"> </span><span class="o">-</span><span class="vg">c100</span><span class="w"> </span><span class="nl">http:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="o">:</span><span class="il">4100</span>
868+
</pre></div>
869+
<h3>wrk</h3>
870+
871+
<p>安装</p>
872+
<div class="highlight"><pre><span class="vg">git</span><span class="w"> </span><span class="vg">clone</span><span class="w"> </span><span class="nl">https:</span><span class="o">//</span><span class="vg">github</span><span class="o">.</span><span class="vg">com</span><span class="o">/</span><span class="vg">wg</span><span class="o">/</span><span class="vg">wrk</span>
873+
<span class="vg">cd</span><span class="w"> </span><span class="vg">wrk</span>
874+
<span class="vg">make</span>
875+
<span class="vg">sudo</span><span class="w"> </span><span class="vg">cp</span><span class="w"> </span><span class="o">-</span><span class="vg">rf</span><span class="w"> </span><span class="vg">wrk</span><span class="w"> </span><span class="o">/</span><span class="vg">bin</span><span class="o">/</span>
876+
</pre></div>
877+
<p>测试</p>
878+
<div class="highlight"><pre><span class="vg">wrk</span><span class="w"> </span><span class="o">-</span><span class="vg">t8</span><span class="w"> </span><span class="o">-</span><span class="vg">c400</span><span class="w"> </span><span class="nl">http:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="o">:</span><span class="il">4100</span>
879+
<span class="vg">Running</span><span class="w"> </span><span class="il">10</span><span class="vg">s</span><span class="w"> </span><span class="vg">test</span><span class="w"> </span><span class="err">@</span><span class="w"> </span><span class="nl">http:</span><span class="o">//</span><span class="mf">127.0.0.1</span><span class="o">:</span><span class="il">4100</span>
880+
<span class="w"> </span><span class="il">8</span><span class="w"> </span><span class="vg">threads</span><span class="w"> </span><span class="vg">and</span><span class="w"> </span><span class="il">400</span><span class="w"> </span><span class="vg">connections</span>
881+
<span class="w"> </span><span class="vg">Thread</span><span class="w"> </span><span class="vg">Stats</span><span class="w"> </span><span class="vg">Avg</span><span class="w"> </span><span class="vg">Stdev</span><span class="w"> </span><span class="vg">Max</span><span class="w"> </span><span class="o">+/-</span><span class="w"> </span><span class="vg">Stdev</span>
882+
<span class="w"> </span><span class="vg">Latency</span><span class="w"> </span><span class="mf">99.83</span><span class="vg">ms</span><span class="w"> </span><span class="mf">16.70</span><span class="vg">ms</span><span class="w"> </span><span class="mf">175.72</span><span class="vg">ms</span><span class="w"> </span><span class="mf">76.86</span><span class="o">%</span>
883+
<span class="w"> </span><span class="vg">Req</span><span class="o">/</span><span class="vg">Sec</span><span class="w"> </span><span class="mf">325.50</span><span class="w"> </span><span class="mf">161.75</span><span class="w"> </span><span class="mf">665.00</span><span class="w"> </span><span class="mf">50.27</span><span class="o">%</span>
884+
<span class="w"> </span><span class="il">22709</span><span class="w"> </span><span class="vg">requests</span><span class="w"> </span><span class="vg">in</span><span class="w"> </span><span class="mf">10.01</span><span class="vg">s</span><span class="p">,</span><span class="w"> </span><span class="mf">5.65</span><span class="vg">MB</span><span class="w"> </span><span class="vg">read</span>
885+
<span class="w"> </span><span class="vg">Socket</span><span class="w"> </span><span class="nl">errors:</span><span class="w"> </span><span class="vg">connect</span><span class="w"> </span><span class="il">155</span><span class="p">,</span><span class="w"> </span><span class="vg">read</span><span class="w"> </span><span class="il">3461</span><span class="p">,</span><span class="w"> </span><span class="vg">write</span><span class="w"> </span><span class="il">0</span><span class="p">,</span><span class="w"> </span><span class="vg">timeout</span><span class="w"> </span><span class="il">775</span>
886+
<span class="vg">Requests</span><span class="o">/</span><span class="nl">sec:</span><span class="w"> </span><span class="mf">2267.99</span>
887+
<span class="vg">Transfer</span><span class="o">/</span><span class="nl">sec:</span><span class="w"> </span><span class="mf">578.07</span><span class="vg">KB</span>
888+
</pre></div>
814889
<h2>阅读文档</h2>
815890

816891
<h3>getting start</h3>

doc/preview/images/mongoose.png

114 KB
Loading

0 commit comments

Comments
 (0)