nodejs - huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · python: tornado from...

68
Nodejs Javascript

Upload: phungkhanh

Post on 16-Sep-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Nodejs �������Javascript

Page 2: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Who am I?

Twitter: @fengmk2

Weibo: @Python��� , @FaWave

���EDP���@�

Page 3: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

-4

1. Hello world F.��B8)Nodejs��/=MH Hello worldF.I��

2. String = Buffer => StreamString�Buffer, Buffer�Stream�C�;�'�A(;�'Javascript J1<�>�Socket9D�PA(EK��L�.@6 HTTP*!�

3. ?$&Q#0 JavascriptNodejs."��8)+�,�

4. �5�*!�5�*! �GO��@6�3Nodejs :���N"NL2�*!�%70�npm

Page 4: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Hello world����

Page 5: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Nodejs� �

��

�����

���

Page 6: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Nodejs , Tornado , Go , Netty

Nodejs: http://nodejs.org

Tornado: http://www.tornadoweb.org

Go: http://golang.org

Netty: http://www.jboss.org/netty

Page 7: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Python: Tornado

from tornado.ioloop import IOLoopfrom tornado.web import RequestHandler, \ Application

class MainHandler(RequestHandler): def get(self): self.write("Hello, world")

application = Application([ (r"/", MainHandler),])

if __name__ == "__main__": application.listen(8080) IOLoop.instance().start()

Page 8: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Go:

package mainimport ( "http" "io")func handler(w http.ResponseWriter, r *http.Request) { io.WriteString(w, "Hello, world")}func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}

Page 9: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Java: Netty

private void handleHttpRequest( ChannelHandlerContext ctx, HttpRequest req) throws Exception { HttpResponse res = new DefaultHttpResponse(HTTP_1_1, OK); res.setHeader(CONTENT_TYPE, "text/html; charset=UTF-8"); setContentLength(res, 11); res.setContent( ChannelBuffers.copiedBuffer( "hello world", CharsetUtil.US_ASCII)); sendHttpResponse(ctx, req, res);}

Page 10: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Nodejs:

var http = require('http');http.createServer(function(req, res){ res.end('Hello, World');}).listen(8080);

Page 11: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Nodejs: 4CPU

var cluster = require('cluster') , http = require('http');var server = http.createServer(function(req, res) { res.end('Hello World');});cluster(server).set('workers', 4).use(cluster.stats()).listen(8080);

Page 12: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����

CPU�$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

8 Intel(R) Xeon(R) CPU E5410 @ 2.33GHz

���16GB

���$ cat /etc/issue | grep Linux

Red Hat Enterprise Linux Server release 5.4 (Tikanga)

Page 13: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����

$ ab -c 30 -n 1000000 http://127.0.0.1:8080/

������Name 30 threads

rps100 rps 1000 rps 5000 rps

Nodejs 7,287 7,038 6,786 6,912

Tornado 2,967 2,966 2,967 2,982

Go 5,214 5,157 5,080 5,164

Netty 13,526 13,351 11,332 7,921

Nodejs4P

14,826 14,332 12,161 8,287

Page 14: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

** Nodejs������ **

Page 15: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

String => Buffer =>

Stream

Page 16: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Javascript!�����%&

,�Javascript1+Unicode String

�)���!�

-��TCP��#�$" ��'(�43���,�Javascript���������

V8 1GB �/�%2

#�.�������!�'(0*� 1GB�.�����

Page 17: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Buffer

Buffer��8�"(���)10�6((9����"(��,*

3 V8��the V8 heap�+�2'�����$����V8 1GB �5#�.7

0 �!Buffer& �4-���%�/��$����0�#����

Page 18: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Buffer

// buffer.jsvar a = new Buffer(10);console.log(a, a.toString());

var b = new Buffer('QCon2011��');console.log(b, b.toString());

$ node buffer.js<Buffer 05 08 4e 00 2f 0f 26 05 04 4e> '\u0005\bN\u0000/\u000f&\u0005\u0004N'<Buffer 51 43 6f 6e 32 30 31 31 e6 9d ad e5 b7 9e> 'QCon2011��'

Page 19: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

�sV/YS�var fs = require('fs')V/�I/OLhrPOSIX&M q���Ni����Q$;e 'R :p�K�

T=�s�var net = require('net')Q$;bp��T=�qC�

O�%�0!WC'6)���Ustreams�N_���(nQ$e �K)�

HTTP !Wc,6)��var http(s) = require('http[s]')Nodeo�HTTP17jH-I24<�;am�HTTP]d�(�P^��DJg.��PL5c�9?\@GB��i5AL8�>�[X�

"17�H-U��*�l#EF+Zf�k`g)25cc�����9M3�

Page 20: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

fs�����

var fs = require('fs');// $ touch /tmp/helloSyncfs.renameSync('/tmp/helloSync', '/tmp/worldSync');var stats = fs.statSync('/tmp/worldSync');console.log('statsSync:' + JSON.stringify(stats));

Page 21: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

fs�����var fs = require('fs');// $ touch /tmp/hellofs.rename('/tmp/hello', '/tmp/world', function (err) { if (err) throw err; fs.stat('/tmp/world', function (err, stats) { if (err) throw err; console.log('stats: ' + JSON.stringify(stats)); });});

Page 22: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

����telnet���(1)// chat.jsvar net = require('net');

var clients = [];

net.createServer(function(client) {

client.write('Enter your name:\n');

client.once('data', function(data) {

var username = data.toString().trim();

clients.push(client);

broacast(username + ' : Join!\n');

client.on('data', function(data) {

var text = username + ' : ' + data;

broacast(text);

});

});}).listen(11021);

Page 23: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

����telnet�(2)

// ���������function broacast(text) { console.log(text.trim()); var i = 0, l = clients.length; for(; i < l; i++) { var c = clients[i]; c.write(text); }};

Page 24: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

����telnet���(3)

Server: $ node chat.jsmk2 : Join!mk2 : Hello qcon2011 hangzhou!

Client: $ telnet 192.168.1.xxx 11021Enter your name:mk2mk2 : Join!Hello qcon2011 hangzhou!mk2 : Hello qcon2011 hangzhou!

Page 25: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

http servervar http = require('http');http.createServer(function(req, res) { if(req.url === '/') { res.end('Hello world'); } else { res.end('HTTP ' + req.method + ' : ' + req.url); }}).listen(8080);

Page 26: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

fs, net, http(s)

http clientvar http = require('http');var options = { host: 'www.google.com', port: 80, path: '/'};http.get(options, function(res) { console.log("Got response: " + res.statusCode); res.on('data', function(data) { console.log(data.toString()); });}).on('error', function(e) { console.log("Got error: " + e.message);});

Page 27: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Stream: ���&

Stream���'5�7�-�2%0�2����$!"HTTP�/ �request'5����+:stdout��>(���#.��6'5�.���

��6'�����3���<���9�3�

,8��'EventEmitter�%��

42�$�*5��)�;���=��6�*��1� (Pipe)�

Page 28: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

��#��fs.ReadStream

��(�#��

var readstream = fs.createReadStream(uploadfile);

!�� #��data���������$�)��"����&% ��')��'read� �&&�����

Page 29: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����fs.ReadStream

readstream.on('data', function(chunk) { console.log('write', chunk.length); // �������� req.write(chunk);});

�end��������������� readstream.on('end', function() {

req.end();

});

Page 30: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Pipe�"=�(#4'H��AdataTP�Aend8!�-��2$::pipe� WJ�Z=�2/ ��

W#7Rpipe�IL)�=��G1XN"@1�U=+�K(#4'�&�C<% ==> ;<%��<%�5D��[���req.end()readstream.pipe(req);

30O��$9QM�.V/ ��?S<%$�[���6*�B�readStream�5 F!�>�E,Y6�upload_file.js

Page 31: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Pipe������

:) �����

��� �

����

Page 32: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�"���fs.WriteStream

��$����

var writestream = fs.createWriteStream(savefile);

� &�� ��%�����!�����%���� ==> ���� #�����������������

res.pipe(writestream);

Page 33: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

��� �fs.WriteStream

� ��������

writestream.on('close', function() { callback(null, res);

});

��WriteStream�����������download_file.js

Page 34: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�������Pipe

Page 35: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

&��7�"�JavascriptNodejs!���$��� �

�%-4� *)��'�63

(��2 *����

#����1

�,�0

5��0

...+-./...

Page 36: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�����

�Web��

������ ��

� �����

......

����� ��IO��� ��

Page 37: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

��Web �

job: �����������

Page 38: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 39: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

���������

Trello: ���#�����3�� !����������� "����

Page 40: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 41: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

��������

Page 42: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 43: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

���� ���

PaintChat: ����������

Page 44: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 45: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

��������

Page 46: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�������!"

Instagram Real-time API Demo: Instagram ���� ��!"��������%����$��&������ �#Socket.io� ����

Page 47: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�������

Cloud9: Web IDE���� ���

Page 48: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 49: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�������: Nodefox

Nodefox: ������������MySQL�������� ������ ���

Page 50: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 51: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�����: Nodefox

Nodefox�����

Page 52: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�������: LogglyLoggly: �syslog�HTTP �Web���

Page 53: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 54: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

� ���

NAE Proxy: Node App Engine�Http proxy� �����������socket�

Page 55: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����: TermKitTermKit: next gen terminal / command application, built out of WebKit and Node.js.

Page 56: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 57: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����: TermKit

Page 58: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):
Page 59: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����: node-gui

@��� ��� nodejs��GTK+ demo

Page 60: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�����

Nodejs������������ � ��

1152����

Page 61: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

�����

��Web�Database�Templating�CSS Engines�CMS�Buildand Deployment�Openssl, Hashing�SMTP� TCP/IP�RPC�Web Sockets & Ajax�Message Queues�Testing�JSON�XML�Debugging�Compression� Graphics�Payment Gateways�API clients�Control flow / Asyncgoodies�I18n and L10n modules ��� ����������������

Page 62: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

������: npm

http://npmjs.org/

Page 63: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

���� : npm

%npm����(

4427+�nodejs��� &!"��# �����'�!"���������$nodejs��mysql����

$ npm install mysql

Page 64: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

����(1)

�Middleware�Connect ������HTTP server�������������

Web���Express, webjs

������node-mysql, redis-node,node-mongoskin

Page 65: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

���(2)

Web Sockets & Ajax, RPC�Socket.io, nowjs

�����nodeunit, expresso

���/���� ��EventProxy, Jscex, async

Page 66: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Node's goal

Provide an easy way to build scalable

network programs.

� ������������

Page 67: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

Q & A ����

Page 68: Nodejs - Huihoodocs.huihoo.com/infoq/qcon-nodejs-20111021.pdf · Python: Tornado from tornado.ioloop import IOLoop from tornado.web import RequestHandler, \ Application class MainHandler(RequestHandler):

next("Thanks ^_^")