Upgrade to Pro — share decks privately, control downloads, hide ads and more …

nodeJS 入門警戒 @wheelLab

nodeJS 入門警戒 @wheelLab

nodejs introduction

wwwy3y3

June 27, 2013
Tweet

More Decks by wwwy3y3

Other Decks in Programming

Transcript

  1. about me • a web developer @ clubond.com • student

    in NCKU • currently on NodeJS • @wwwy3y3 Thursday, July 4, 13
  2. what is NodeJS • built on google chrome’s V8 js

    engine • javascript • async Thursday, July 4, 13
  3. evented I/O • single threaded • event loop • when

    you’re done, call me back! Thursday, July 4, 13
  4. take it to system DB query $sql      

     =  'SELECT  foo  FROM  bar  WHERE  id  =  42'; $result  =  mysql_query($sql,  $link); echo  $result; DB.query(‘SELECT  foo  FROM  bar  WHERE  id  =  42’, function(err, rows){ doSth(rows); //deal with rows }); PHP sync way node async way Thursday, July 4, 13
  5. eventEmitter var util = require('util'); var events = require('events'); var

    Bomb = function() { }; util.inherits(Bomb, events.EventEmitter); Bomb.prototype.blow = function() { this.emit('blow', 'byebye'); }; Thursday, July 4, 13
  6. Module • use modules to manage your code var circle

    = require('./circle.js'); console.log( 'The area of a circle of radius 4 is ' + circle.area(4)); }; var PI = Math.PI; exports.area = function (r) { return PI * r * r; }; exports.circumference = function (r) { return 2 * PI * r; The contents of circle.js: Thursday, July 4, 13
  7. npm •Node Packaged Modules •like CPAN in perl, gem in

    ruby... •“npm install package-name” •“npm publish <folder>” Thursday, July 4, 13
  8. what’s on npm? • everything you think of!! • framework

    • database • templating • css engines • crypto/hashing • smtp, ftp, xmpp • websocket • testing • .... Thursday, July 4, 13
  9. callback hell fs.readdir(source, function(err, files) { if (err) { console.log('Error

    finding files: ' + err) } else { files.forEach(function(filename, fileIndex) { console.log(filename) gm(source + filename).size(function(err, values) { if (err) { console.log('Error identifying file size: ' + err) } else { console.log(filename + ' : ' + values) aspect = (values.width / values.height) widths.forEach(function(width, widthIndex) { height = Math.round(width / aspect) console.log('resizing ' + filename + 'to ' + height + 'x' + height) this.resize(width, height).write(destination + 'w' + width + '_' + filename, function(err) { if (err) console.log('Error writing file: ' + err) }) }.bind(this)) } }) }) } }) Thursday, July 4, 13
  10. use control flow library async.series([        function(callback){  

                 //  do  some  stuff  ...                callback(null,  'one');        },        function(callback){                //  do  some  more  stuff  ...                callback(null,  'two');        } ], function(err,  results){        //  results  is  now  equal  to  ['one',  'two'] }); Thursday, July 4, 13
  11. want to use OOP? • use Function, in JS, only

    function has its own scope • Prototypal OOP • use NodeJS core module- util.inherit() Thursday, July 4, 13
  12. prototypal OOP function Person(name) { this.name = name } Person.prototype.greet=

    function() { var self= this; console.log(self.name + ”say Hello”); } function AngryGuy () { AngryGuy.super_.apply(this, arguments); } util.inherits(AngryGuy, Person); AngryGuy.prototype.greet= function(){ var self= this; console.log(self.name + “say: fu** off!!!!!”); } Thursday, July 4, 13
  13. error handling function x() { throw new Error('my silly error')

    } x() node.js:134 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: my silly error at x (/Users/benno/apkudo/test.js:2:11) at Object. (/Users/benno/apkudo/test.js:5:1) at Module._compile (module.js:402:26) at Object..js (module.js:408:10) at Module.load (module.js:334:31) at Function._load (module.js:293:12) at Array. (module.js:421:10) at EventEmitter._tickCallback (node.js:126:26) Thursday, July 4, 13
  14. try-catch? try { x() } catch (err) { console.log("Error:", err)

    } Error: { stack: [Getter/Setter], arguments: undefined, type: undefined, message: 'my silly error' } Thursday, July 4, 13
  15. try catch on async ?? function y(arg, callback) { !

    function onTick() { ! x() ! callback() ! } ! process.nextTick(onTick()) } Thursday, July 4, 13
  16. it’s not working node.js:134 throw e; // process.nextTick error, or

    'error' event on first tick ^ Error: my silly error at x (/Users/benno/apkudo/test.js:2:11) at Array.onTick (/Users/benno/apkudo/test.js: 11:6) at EventEmitter._tickCallback (node.js:126:26) Thursday, July 4, 13
  17. domain!! var d = domain.create(); d.on('error', function(er) { console.error('Caught error!',

    er); }); d.run(function() { process.nextTick(function() { setTimeout(function() { // simulating some various async stuff fs.open('non-existent file', 'r', function(er, fd) { if (er) throw er; // proceed... }); }, 100); }); }); Thursday, July 4, 13