37836

Upload: adisorn-somboonsuk

Post on 07-Jul-2018

219 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/18/2019 37836

    1/55

  • 8/18/2019 37836

    2/55

    1

    ประวัตการแก ไข

    ครั งท   วันท  

    รายละเอยดการแก ไข

    1 9 ม.ค. 2559 เร มสราง และเผยแพรผลงาน2 10 ม.ค. 2559 เพ มเร อง MySQL เขาไป

    ถาทานดาวน โหลดท งไวนาน แลวเพ งมาเปดอาน 

    กขอรบกวนให โหลดใหมอกคร ังท  

    http://www.patanasongsivilai.com/itebook_form.html 

    เผ อผมอัพเดตแก ไข pdf ตัวใหมเขาไป หรอใครไปดาวน โหลดมาจากท อ น

    กอาจพลาดเวอรช ันใหมลาสดไดครับ

    และรบกวนชวยกรอกแบบสอบถาม ตามลงคขางบนดวยนะครับ

    แอดมนโฮ โอนอยอก

    (จตรพัชร พัฒนทรงศว ไล)

    9 มกราคม 2559

    ถาสนใจเก ยวกับเพจดานไอท กตดตามไดท  https://www.facebook.com/programmerthai/  

     EBook เลมนสงวนลขสทธตามกฎหมาย หามมใหผ  ใด นาไปเผยแพรตอสาธารณะ เพ อประโยชนในการคา หรออ นๆโดย

    ไมไดรับความยนยอมเปนลายลักษณอักษรจากผ  เขยน ผ  ใดละเมด จะถกดาเนนคดตามกฎหมายสงสด 

  • 8/18/2019 37836

    3/55

    2

    กอนจะอานหนังสอเลมน  

    สาหรับใครท เพ งเปดเลมน ข นมาอาน แลวยังไมร  วา Node.js คออะไร มันใชทาอะไร รวมทั งทฤษฎโนนน นั นผมไดอธบายไวแลว ในหนังสอท ผมแตง 2 เลม ไดแก 

    1) 

    “เสยดายไม ไดอาน จาวาสครปตฝ งเซรฟเวอร (Node.js ฉบับยอ) เลม 1”2) 

    และควรจะอานอกเลมเสรมคอ “วธตดตั ง Node.js และ npm เบ องตน” 

    (ลงคดาวน โหลด http://www.patanasongsivilai.com/itebook_form.html)

    เกร นนา

    หนังสอเลมน จะอธบายเก ยวกับ Node.js โดยจะตะลอนทัวรพาทาเวรคชอป (work shop) งาย ๆ เพ อใหเหนภาพรวมของการใชงานภาคปฏบัต มากกวาภาคทฤษฎ ซ งเน อหาคงไม ไดเจาะลกรายละเอยดข ันเทพมากมาย

    แตกหวังวามันจะชวยประหยัดเวลาในการเรยนร  ของคณ และสามารถชวยคณนาไปตอยอดงานในอนาคตได 

    สดทายน หากเน อหามอะไรผดพลาดไป เช น ใหขอมลผด สะกดอะไรผดไป มมแปกบาง ขาบาง หรออานแลวมนงงไป 7 วนั เปนตน ผมกขออภัยมา ณ โอกาสน ดวย และถาคณเขาใจ ไมเขาใจยังไง กสามารถช แนะผมไดตลอดเวลา

    …อกทั งผมกตั งใจจะหมั นอัพเดตเน อหา ข นอย กับเวลา โอกาส และความสามารถจะอานวย

  • 8/18/2019 37836

    4/55

    3

    การอานและเขยนไฟล 

     ในบทน จะกลาวถงมอดล fs ซ งม ไวอานและเขยนไฟล โดยผมจะแนะนาการใชงานเบ องตนเทาน ัน ซ งถาใคร

    เคยอานเลมแรกของผม กจะเหนวธ ใชงานผานตามาแลว ดวยประโยคคาสั ง

     var fs = require('fs');

    วธอานไฟล 

     ในตัวอยางน  ผมจะใชมอดล fs อานไฟลช อ “json.text” ซ งขอความขางใน มันคอชนดขอมลแบบ JSON

     โครงสรางโปรเจคกจะเปนดังน  

    C:\testfile|-- files

    |-- json.txt

    |--readfile.js 

     var fs = require('fs');  // โหลดมอดล fs 

    fs.readFile('./files/json.txt', 'utf8', function(err, buffer) {if  (err) {

    console.log(err);  // แสดงขอความผดพลาดออกมา 

    }

    console.log(buffer.toString());  // แสดงขอความท อย  ในไฟล json.txt 

    });

    console.log('Read a file...');

    {"Font":[

    {"color":"red", "lang":"thai"},

    {"color":"blue", "lang":"eng"}

    ]}

    ภายในไฟลจะเขยนโคดดังน  

    ออบเจกตท เรยกวา Buffer 

  • 8/18/2019 37836

    5/55

    4

    เม อพมพคาสั ง “node readfile.js” กจะไดผลลัพธดังน  

    C:\testfile>node readfile.js

    Read a file…{"Font":[

    {"color":"red", "lang":"thai"},

    {"color":"blue", "lang":"eng"}

    ]}

    เม อยอนกลับไปท  โคด คาอากวเมนตตัวท สองของ fs.readFile(…, 'utf8' ,…) จะเปนการบอกคา encodingหรอการเขารหัสตัวอักษร (ในตัวอยางน คอ 'utf8') ซ งเราจะระบ ไว หรอจะไมระบ ไวเลยก ได ดังโคดตัวอยาง

    fs.readFile('./files/json.txt', function(err, buffer){ /*...*/ }

    *** แตถาไมระบ ไว …โดยดฟอลตแลว คา encoding จะเปน null 

    ถาไฟล json.txt อย ท  ไดเรคเทอร เดยวกันกับ readfile.js ก ไมตองระบช อพาธ ดังโคดตัวอยาง

    fs.readFile('json.txt', function(err, buffer){ /*...*/ }

    วธเขยนไฟล 

    ผมจะสรางไฟล “writefile.js” ในโปรเจคเดม …เพ อเอาไวเขยนขอความ “'I am a programmer” ลงไปใน

     ไฟล “message.txt” โดยจะม โครงสรางโปรเจคดังน C:\testfile

    |-- files

    |-- json.txt

    |--readfile.js

    |-- writefile.js

    จะเหนโคดในหนาถัดไป 

     ไม ได ใชงานสาหรับตัวอยางน  

  • 8/18/2019 37836

    6/55

     

     v

    fs

     

    );

    c

     ใ

    C:E

    It'

    r f

    wr

     

    ns

    ตัว

     \ted

    s s

     ไป

    s

    ite

      '

      '

    ol

    อย

    stfiwri

    v

    เป

    อค

    r

    il

    './fi

    'I a

    'ut

      fu

     

    } /

    .lo

    าง

    iletin

    d!

     โฟ

    วา

    q

    (

    les

     

    8', 

    ct

     

    ส 

    g('

    เม

    nt

    ลเ

     “

    ire

     /m

    p

     

    io

      i

     

    }

    n

     อพ

    dee

    อร

    I a

    ('fs

    es

    ro

     (

    (

    onฟ

     w

    มพ

    w  file

      C

     

    ');

    ag

    ra

    rr)

    rr)

    solกช

      riti

    คา

    rit 

    :\t

     p

       /

    e.t

    {

    {

    c

    e.l น 

    ng

    สั ง

    fil

    st

      rog

     โ

    t',

    er '

    ns

    og( 

    th

    “n

    .js

    ile

      ra

    ',

    ol

    'It\

    fi

    od

     \fil

     

    .l

    's s

      e');

     

    es

      er

      าร

    ดล

    g(

      av

     

    rit

      ค

    ช อ

    ขอ

    หัส

    fs 

    rr)

    d!'

      fil

    วร

    งน 

     ไฟ

    คว

    (ร

     

    ;

    ');

    e.j

    จะเ

    รั

     ท 

    าม

     

    ” 

    หน

    ะเ

     จะ

       //

      จะ

    ช อ

      ย

    เข

     ไม

     แ

     ได

       ไ

    ดง

      “

    คว

    งไ

    )

    ขอ

      ัพ

    me

    าม

     ห

    คว

    ดัง

    ss

    ลงไ

      รอ

    น  

    ge

    จะ

    ดพ

    .tx

     

    ชเ

    ลา

    ” 

    ดอ

      ก

    รา

    เจ

    า 

    ข 

    กต 

    มา

    Bu

    ffe

    ะเ

    r ก

      ม อ

    ด 

    ปด

     

    อา

    5

    นก

     

  • 8/18/2019 37836

    7/55

    6

    เม อยอนกลับไปท  โคดเดม ในเมธอด fs.writeFile() จะมรายละเอยดของคาอากวเมนตท นาสนใจดังน  

      คาอากวเมนตตัวแรกจะบอกช อไฟล ./files/message.txt ซ งมันจะถกสรางข นมาใหมทกครั ง เม อ

    เรยกเมธอด fs.writeFile() ใหทางาน …แตถาระบแคช อเปน “message.txt” (ไมมพาธ) ไฟลกจะถก

    สรางข นในไดเรคทอร เด ยวกันกับ writefile.js 

      คาอากวเมนตตัวท  2 จะเปนขอความท เขยนลงไป ซ งในท น คอ “I am a programmer” แต

    ขณะเดยวกัน เรากสามารถระบเปนออบเจกต Buffer ไดดวย

      คาอากวเมนตตัวท  3 จะบอกคา encoding เปน 'utf8' แตถาไมไดระบคาน  โดยดฟอลตแลวจะเปน

    'utf8' 

    หมายเหต   

    สาหรับรายละเอยดของ fs.readFile() กบั fs.writeFile() มันยังมตออกนะครับ ลองอานเพ มเตมด ไดท  

    https://nodejs.org/api/fs.html 

     ไมเพยงเทาน ัน ในมอดล fs กยังมเมธอดอ น ๆ อกเยอะมาก แตผมขอตัดจบกอน เพราะคดวาทานนาจะเขาใจ

    หลักการทางานไมยากแหละ

  • 8/18/2019 37836

    8/55

  • 8/18/2019 37836

    9/55

    8

    สวนวธการเขาถงคาในบัฟเฟอร กจะเหมอนเวลาคณใชงานอารเรย ดังตัวอยาง 

     var buf = new Buffer('Hello World');

    console.log(buf[10]);  // แสดงตัวเลข 100 ออกมา (คา ASII คอ d ตัวพมพเลก) buf[10]  = 90;  // แก ไขตัวอักษรท อนเดกซ 10 ใหมคาเปน 90 (คา ASCII คอ Z ตัวพมพ ใหญ) 

    console.log(buf.toString());  // แสดงผล “Hello WorlZ” 

     ในตัวอยางน ตัวแปร buf คอบัฟเฟอร ท เกบคาสตรงเปน “Hello World” โดยเราสามารถเขาถงตัวอักษรท อย 

     ในสตรง ดวยการระบตาแหนงอนเดกซภายในวงเลบเหล ยม (buf[index]) เหมอนเปนอารเรยธรรมดาตัวหน ง 

    อยางท บอกในตอนตน บัฟเฟอรสามารถจัดการในระดับไบตได ดังน ันตอนสรางบัฟเฟอร เราจงสามารถระบ

    ขนาดใหมหนวยเปนไบต ได แตคาเร มตนของสมาชกในบัฟเฟอร มันจะมคาแบบส ม (Random) ดังตัวอยาง 

     var buf = new Buffer(10);  // สรางบัฟเฟอรขนาด 10 ไบต 

     // คาสมาชกภายในบัฟเฟอร จะถกกาหนดคาเร มตนเปนแบบส ม 

    console.log(buf);

     // แสดงผลลัพธ 

     ในตัวอยางถาลองใช console.log(buf) แสดงคาสมาชกภายในบัฟเฟอรออกมา กจะเหนมันเกบคาเร มตนเปน

    แบบส ม

    บัฟเฟอรมันยังมเมธอด slice() เอาไวตัดแบงสตรงใหเลกลง ดังตัวอยาง

     var buffer = new Buffer('Hello World');

     var smaller = buffer.slice(6, 11);

    console.log(smaller.toString());  // "World" 

    console.log(smaller === buffer);  // false 

     ในตัวอยางน ประโยค buffer.slice(6, 11); จะตัดแบงสตรงตัวเดม จากอนเดกซตาแหนงท  6 ไปจนถงตาแหนง

    ท  11 (ตัวสดทาย) แลวไดเปนบัฟเฟอรตัวใหมท เกบคาสตรงเปน "World"

  • 8/18/2019 37836

    10/55

    9

    นอกจากน แลวบัฟเฟอรยังมเมธอด copy() เอาไวกอปป  คาสตรงจากบัฟเฟอรตัวหน ง ไปยังบัฟเฟอรอกตัว ดัง

    ตัวอยาง

     var source = new Buffer('Hello World'); var target  = new Buffer(6); 

     var targetStart = 0;

     var sourceStart =6;

     var sourceEnd = 11;

    source.copy(target, targetStart, sourceStart, sourceEnd);

    console.log(target.toString());  // "World" 

    console.log(target === source);  // false 

     ในตัวอยางน จะกอปป  คาสตรงจากตัวแปร source โดยเร มจากอนเดกซตาแหนงท  6 จนถง 11 แลวนาคาสตรง

    ท  ไดมาใส ไว ในตัวแปร target ตั งแตอนเดกซ 0

    …สาหรับผลการทางานของตัวอยางน  จะเหมอนกับการใชเมธอด slice() ในตัวอยางกอนหนาน ทกประการ

    หมายเหต   

    สาหรับรายละเอยดของ Buffer มากกวาน  สามารถดเพ มเตมไดท  

    https://nodejs.org/api/buffer.html#buffer_new_buffer_array 

  • 8/18/2019 37836

    11/55

    10

    แนวคด EMITTER PATTERN

    อยางท ทานทราบ คอลแบคใน Node.js จะถกเรยกเม อเกดเหตการณเกดข นมา

    แตเรากสามารถสรางเหตการณ ไดดวยตัวเอง ดวยรปแบบการเขยนโปรแกรมท เรยกวา Emitter pattern  ซ ง

    มันคลาย ๆ กับด ไซนแพทเทรน (Design pattern) ท เรยกวา “observer pattern”

    …เอานะ ถาใครไมร  จักด ไซนแพทเทรนดังกลาว เด ยวผมจะอธบายดวยรปภาพตอไปน แลวกัน

    จากรป Event emitter กคอออบเจกต ท มคอลแบคมาลงทะเบยนไดแก function_1 กับ function_2 ซ ง

    พวกมันจะทาหนาท เปน Listener หรอผ  ฟงเหตการณท เกดข น ไดแก "data" กับ "connection"

    …สาหรับเหตการณ "data"  กับ "connection" เราสามารถตั งช อเปนสตรงอะไรกได แลวเม อเกดเหตการณ

    ดังกลาวข นมา ตัวคอลแบคกจะถกเรยกใหทางาน ดังภาพขางลาง

     ในภาพเม อ Event emitter สงเหตการณ "data" กับ "connection" ตัวคอลแบคไดแก function_1 กับ

    function_2 กจะถกเรยกใหทางานตามลาดับ

    ลงทะเบยนดวยเหตการณ "connection" 

    สงเหตการณ "connection" 

    สงเหตการณ "data" 

    ฟงกช ันคอลแบคช อ

    function_2

    ลงทะเบยนดวยเหตการณ "data" 

    ฟงกช ันคอลแบคช อ

    function_1

    function 2

    function_1

    Event emitter 

    Event emitter 

    ลงทะเบยน 

    ถกเรยกใหทางาน

  • 8/18/2019 37836

    12/55

    11

    เพ อไม ใหเปนการเสยเวลา ดตัวอยางโคดกันดกวา …มันงายมากเลย

     var events = require('events');

     var eventEmitter = new events.EventEmitter(); // สรางออบเจกต Event emitter eventEmitter.on('data', function(){  // ลงทะเบยนคอลแบค ดวยเหตการณ "data" 

    console.log('Listen data');

    });

    eventEmitter.on('connection', function(){  // ลงทะเบยนคอลแบค ดวยเหตการณ "connection" 

    console.log('Listen connection');

    });eventEmitter.emit('data');  // สงเหตการณ "data" 

    eventEmitter.emit('connection');  // สงเหตการณ "connection" 

     โคดในตัวอยางน  มันจะแสดงผลลัพธเปน

    Listen data

    Listen connection

     ในโคดจะมรายละเอยดท นาสนใจดังน  

      เมธอด eventEmitter.on() คอการลงทะเบยนคอลแบค พรอมทั งระบเหตการณท จะรับฟง

      สวน eventEmitter.emit() คอการสงเหตการณ เพ อเรยกคอลแบค (ท ลงทะเบยนไว) ใหทางาน

    นอกจากน แลว Event emitter มันยังมเมธอดอ นอก นอกจาก on() กับ emit() ตัวอยางเชน

    เมธอด คาอธบายaddListener ใชงานเหมอนกับเมธอด onremoveEventListener ลบคอลแบคท  ไดลงทะเบยนไว removeAllEventListeners ลบคอลแบคทั งหมดท  ไดลงทะเบยนไว 

  • 8/18/2019 37836

    13/55

    12

    นอกจากน แลวเราสามารถสรางคลาสข นมา แลวสบทอดมาจาก Event emitter ดวยเมธอด util.inherits()

    ดังตัวอยางโคดตอไปน  

     var util = require('util'); var events = require('events'); 

    class Ticker{  // ประกาศคลาสใน ES6 

    constructor(){  // ประกาศคอนสตรัคเตอร ใน ES6 

    let handler = () => this.emit('tick');  // ฟงกชั นลกศรท ช อ handler 

     // เม อออบเจกตถกสรางข นมาจากคลาส Ticker

     // กจะทางานแบบอะซงโครนัส ดวยการดเลยเรยกฟงกชั น handler ทก ๆ 1 วนาท 

    setInterval(handler, 1000);  // 1000 milliseconds 

    }

    }

     // คลาส Ticker สบทอดมาจาก events.EventEmitter

    util.inherits(Ticker, events.EventEmitter);

    let ticker = new Ticker();  // สรางออบเจกตดวยโอเปอเรเตอร new 

    ticker.on('tick', function() {  // ลงทะเบยนคอลแบคดวยเหตการณ 'tick' 

    console.log("tick tock");

    });

     ในตัวอยางน ผมเขยนโคดดวย ES6 (เขยน ES5 แบบเดมก ได แตย งยากมาก) ซ งการทางานกจะไดตามภาพ

    เรยกใช emit('tick') 

    ลงทะเบยนดวย on('tick', ….) 

    ออบเจกต

    ticker

    function() {

    console.log("tick");

  • 8/18/2019 37836

    14/55

  • 8/18/2019 37836

    15/55

     

     ใ

    เว

     ไม

    C:C:

     ใ

    n

    ชั 

    ถั

    รค

     กน

    จะ

     \m \c

    m

    สั ง

     ไป

    เข

    น  

      อ

    สม

    สร

    kdi 

    in

    น จ

     ไร

    เห

    กยั

    ยน

    ผม

    งา

    ตา

    างโ

    ir eb

     าสั 

    it -

    ะส

    มแ

    งได

    ยง

    รเ

    ฟล

    eap

    ง n

    y

    าง

    พก

    รง

    รั

    าค

    เดอ

    ap 

    p

    เก

     ท 

     “

    …เ

     (เ

    ร 

    p

    ดั

     “

    อะ

    แล

     อง

     ย

    e

    งต

    pa

     ไร

    ว เ

      นะ

    ดต

    เท 

    ะถ

    กั

    a

     ไป

    ka

    ดต

    รา

    นา

    าไ

    ปะ

    p

    น  

    ge.

    งล

    o

    วร 

     พ

    )

    เอา

    so

    าร

    รา

    e.j

     ไป

     

     ไวเ

    n”

    ง เ

    ถตั

    งไว

    s แ

      

    ดว

      น

    ซ ง

    ปน

    ข ั

    ละ

      ส

    ดว

       อ

    จะ

    ตน

    พ อ

     n

      

    างเ

    ธส

    ย ข

     ไฟ

     ใช

    m

    วบ

    ราง

    งโ

    ธบ

    ลน

     เบ 

    แอ

    เว

    รเ

    าย

    จะ

    สร

    าร

    งต

    จค

    ปร

      ก

    าง

    จัด

    น”

    ลเค

    แล

    เจ

    รา

     pa

    )

    เค

    ชั น

    วย

    ขอ

    งข 

    cka

     โป

    ชั 

    เบ 

     N

    d

    งเ

    ge

    รเจ

    ขอ

    งต

    d

    เขา

    า (

     แ

    .js

    คใ

     า

    นด

    .js

    ปใ

    m

      ว

    n

    มภ

    วย

    กเ

    นไ

    ta

    ย  ใ

    ปเ

    าค

    าย

    N

    หม

    เร

    at

     โ

    ลย

    ตไ

    de

    อน

    คเ

    a)

    ลเ

      ได

      งา

    ฟล 

    .js

    เวล

    อร 

    ชน

    ยข 

     p

     โด

    าค

    ดัง

     โ

      w

    าม

    น 

    ck

    จะ

    ณไ

    ลา

    รเ

    eb

    รถ

      (ล

    ag

    อธ

    ap

    ขา

    อง

    .js

    บา

    อน

      วย

      ออ

      ไ

     าน

    n

    เป

    ถ น

    คา

      ะไ

    งร

      ยัง

     

    นแ

    อส

    สั ง

    เว

     

    หัว

    งส

    14

    นว

    าน

    อร

      ขอ

    อท 

     

  • 8/18/2019 37836

    16/55

  • 8/18/2019 37836

    17/55

    16

    มาเขยนไฟลจาวาสครปต เพ อสรางเวบแอพกันเถอะ

    ผมจะโหลดมอดลท ช อ “express” เขามา ดวยประโยคคาสั งดังตัวอยาง 

     var express = require('express');

     var app = express();

    เราสามารถใชออบเจกต app มารับรเควสต (Request) จากเวบบราวเซอรเปนแบบ GET ดวยโคดดังตัวอยาง

    app.get('/', function(req, res) {

    res.send('Hello world ');  // สงเรสปอนส (Response) ตอบกลับออกไป 

    });

     ในตัวอยางจะเหนวา เมธอด app.get() จะรับคาอากวเมนตตัวแรกคอ path (URL) สวนตัวท สองจะเปนคอล

    แบค ซ งมพารามเตอร 2 ตัว ไดแก 

      ตัวแปร req จะรับคาเปนออบเจกต (ตัวแทนรเควสต)

      ตัวแปร res จะรับค าเปนออบเจกต ซ งมเมธอด send() เอาไวสงเรสปอนสตอบกลับไปยังหนาเวบ

    บราวเซอรท เรยกเขามา  จรง ๆ แลวคอลแบคดังกลาว มันยังมพารามเตอรตัวสาม ซ งรับคาเขามาเปนฟงกชั นคอลแบคอกท 

    เพ อเรยกตอไปยัง middleware ตัวถัดไปใหทางาน (เด ยวจะไดเหนในบทถัด ๆ ไป)

    ***นอกจากน แลว app ยังมเมธอดอ นอก ตัวอยางเชน app.post(), app.put() และอ น ๆ อก …ซ งช อเมธอด

    จะตรงกับช อ METHOD ของโปรโตคอล HTTP อกดวยนะครับ

    ขอเพ มเตมสักเลกนอย สาหรับออบเจกต res ในตัวอยางเดม มันยังมเมธอดท นาสนใจดังน  

    เมธอด หนาท  res.download() ให ไคลเอนตดาวน โหลดไฟล ไปใชงานres.end() ส นสดการสงเรสปอนส res.json() สงเรสปอนสเปนแบบ JSONres.jsonp() สงเรสปอนสเปนแบบ JSONP

    res.redirect() เปล ยนทศทางรเควสตท ตดตอเขามาres.render() สั งใหเทมเพลต (temple engine) แสดงผลบนหนาเวบ (จะเหนการใชงานในบทถัดไป)

  • 8/18/2019 37836

    18/55

  • 8/18/2019 37836

    19/55

  • 8/18/2019 37836

    20/55

    19

    ขอแทรกดวย RESTful

    คาวาเวบเซอรวสในมมผ  เขยน มันคอเซอรวสฝ งเซรฟเวอรท  ใหบรการอะไรสักอยาง โดยท  ไคลเอนตเวลาตดตอ

    กับฝ งเซรฟเวอร ทั งค จะไมแครวาอย บนฮารดแวร หรอ OS อะไร (ไมสนใจแพลทฟอรม) และไมสนใจวาทั งสอง

    ฝ งใชภาษาโปรแกรมอะไรในการคยกัน แตทั งน เวลาไคลเอนตขอใชบรการจากเซอรวส ขอมลจะตองว งอย บน

     โปรโตคอลของเวบไซตคอ HTML …ดวยเหตน เขาถงเรยกมันวา เวบเซอรวส 

    ถงอยางไรกตามฝ งเซรฟเวอรผ   ใหบรการ กับฝ งไคลเอนต จะตองตกลงกันกอนวา จะใหคยกันดวยรปแบบไหน(ว งอย บน HTML น ันแหละ) ซ งในปจจบันจะนยมใชเปน SOAP หรอ RESTful (เรยกสั น ๆ วา REST)

    แต ในบทน จะกลาวถงเวบเซอรวสแบบ REST อยางเดยว ซ งสามารถสงขอมลไดเปน ขอความ, JSON และ

    XML …และเพ อไม ใหเปนการเสยเวลา กจะใหดตัวอยางในหัวขอถัดไปแลวกันนะ

    เตรยมไฟล JSON ตัวอยาง

    {"Font":[

    {"color":"red", "lang":"thai"},

    {"color":"blue", "lang":"eng"}

    ]}

    ผมจะบันทกไฟลน อย  ในโปรเจคเดมเปนช อ “font.json”

    C:\webapp

    |-- node_modules\...

    |-- package.json

    |-- app.js

    |-- font.json

    HTTP ในหัวขอน ผมจะพาทาเวบเซอรวส (Web Service) …ซ งช อ

    ของมันข นตนดวยเวบกจรง แตมันไม ใชเวบไซตนะ

    Web service

  • 8/18/2019 37836

    21/55

    20

    แก ไขไฟล app.js

     ในตัวอยางน  ผมไดนาไฟล app.js ของตัวอยางเดม มาแก ไขเสยใหมดังน 

     var express = require('express');

     var app = express();

     var fs = require("fs");

    app.get('/listFont', function(req, res) {  // http://ipaddress:8081/listFont 

    fs.readFile( __dirname + "/" + "font.json", function (err, data) {

    if (err){

    console.error('Error read a file:', err.stack);

    }

    res.end( data );

    }); // ส นสดคอลแบค 

    });

    app.listen(8081, function() {

    console.log('Server running at http://localhost:8081/');

    });

    console.log("Start server");

    เม อนาไฟล app.js มารันจะไดผลลัพธดังน  

    C:\code\webapp>node app.js

    Start server

    Server running at http://localhost:8081/  

    เปล ยนพอรตจาก 8080 เปน 8081 (ตั งเปนอะไรก ได)

    ตัวแปร __dirname จะมขดลางสองอันวางตดกันซ งจะแทนท ดวยช อไดเรคเทอร  ซ งไฟล app.js มันอาศัยอย  

    อานเน อหาในไฟล font.json

    แลวสง data (Buffer) กลับออกไปหาไคลเอนต 

  • 8/18/2019 37836

    22/55

     

    เม 

    เซ

    ...

     

    มเ

     

    ht

     

    อไ

    รฟ

    กไ

    ร อ

    หร

    หร

    tp:

     

    ลเ

    เวอ

    เร

    ล 

    ท 

     

    บเ

    เห

    บร

     // 

     

    อน

    รก

    สา

     fo

     

    สา

     โป

     

    สาDE

     ใน

     อง

    ต   

    าย

    xp

     

    ตต

    t.j

    อง

    รั

    แก

    รัLE

      ัว

    เว

    ะเ

    res

     

    so

    เมา

     ใค

    รม

     RE,

    ยา

    เซ

      ย

    sjs.

     

    เข

    กล

    ดส

     แ

    สม

    รท 

     า

    ESP

    น 

    รว

    co

     

    าม

    บอ

    อบ

    สด

    อย

      ังไ

      ัวเ

     ใ  ST

    ช 

    สแ

    m/ 

     

    ดว

    อก

    กา

     โช

      ด

    มร  

    ปน

    ตั  ได

    ES

    บบ

    xp

    en

     

    ยโ

     อ

    น 

      ัก

    อยอก

     T

    R

    re

    4x

     

    รโ

     ดว

    งา

     

    RE

    เอ

     างดว

      ับ

    ST

    s

     /a

     

    ตค

      ยข

    าด

     T

     จ 

    าก

    i.h

     

     าง

    งภ

     …เ

     น

     ใช 

    กว

    tm

     ht

    J

    งา

    าพ

    าไ

    M

    x

    ะแ

    น  

    p (

    O

     จา

    แล

     T

    re

    สด

    ถา

    แบ

    (

    ดว

    เป

    สง

    O

    s

    งา

     าน

    ยก

     

    รเค

     เ

    ย ๆ

      จก

    E

    มา

    ารเ

     

    งใ

    วส

     จร

      ผ

    อา

    h

    ) เ

    จา

    ปด

      เว

    ต ไ

     GE

    เพ

    ttp

     ไฟ

    หน

    บบ

    ขอ

     T

    าร

     มเ

    ://l

     ht

    ล 

    าเว

    รา

     ใช

    ตจ

      ว

    ช 

    มไ

    oc

    JS

    p:

    on

    บข 

    เซ

    รง

    ยัง

    Ex

    ดท 

    alh

    ON

     /l

    t.js

    นม

    อร

    าร

     ๆ

    re

     

    os

     

    ca

    on

    า แ

     งร

    จา

      ลว

      ด

    ss

    :8

    lh

     

    ลว

    เคว

    เซ

      ยัง

      ทา

    หเ

    81

    st:

    กร

    สต 

    รฟ

      า

      งเล

      น

     /li

    80

      วอ

      าร

      อก

    tF

    1/ 

    UR

      สา

      รก

      ถใ

      อ น

     ไอ

    nt

    list

    มา

      ด 

    เป

        ใ

    ดย

     

    Fo

    จะ

      ถเ

     

    P

    เท

    nt 

    เห

      ย

    UT

    นไ

    น 

    p

      ...

     

    ,

    ด 

     อน

    p.j

     ง

    คว

    ครั

     

    21

    าม

  • 8/18/2019 37836

    23/55

     

    “เ

    ข ั

    n

     ใ

    บเ

    g

    หร

    รง

    ตั ง

    m

    กภ

     ได

    กร

    n

    ลอ

    บว

     ว

    มอ

    in

    ะไ

    าพ

    รค

    อนะ

    ra

    ลน

    ธน  

    ทา

    ท 

    ดล

    ta

    ข ั

     ใน

    (เม 

    แต

    ท เ

    ทอ

    นธ

    or

    นะ

    ผม

     1

    ex

      l e

    นโ

    ถาเ

    รดั

    าผ น

    ซ ง

    ครั

    กดั

    ข ั

    วา

     

    pr

      xp

    ดว

    se

    ปน

    ะเ

    ท ก

     ได  ัน

      เจ

    ดแ

    เรา

    ss

      res

    ดไ

     ก ใ

    na

    M

    ลา

    แนลก

    าข

      า

    ตอ

    ge

      s-g

    ห ไ

    m

    ac

    ะนท ง

    องเ

    อง

    มา

     อไ

    ne

    en

    อย

    ท  

    S

    e

     โ

    ชบ

    า Eเก

    ดย

    เดย

    จา

    ปน

    at

    ra

    าก

     “C

    อช 

    หร

    pr

    ยม

    นว

    xpนไ

    กั

    วกั

    กล

    เล

     า

    tor

    :\ 

     โ

     L

    es

    นจ

    นโ

    resป

    กั

     ...

     งเ

    วย

     -g

     ณ

    se

    ลเ

    in

    (ใ

    ะใ

    วส

    sจง

    เย

    xp

    ซ ง

    อะ

    คา

     

    s\ 

    x

      บ

    เป

    นเ

    res

    ละ

      ัน

    หน

      ั ง

      เป

    s

    ขอ

     ให

     

    นตั

    แตะน

    รก

    s

     ht

    จะ

     อย

     อไ

      ได

    rn

    งผ  

     ไป

    ac

    วรั

    มาใ

    ซ 

     งมั

    p:/ 

    รา

    น  

    เร

    m

    ชง

      “

    OS

    คา

    เม 

     ได

    ะใ   ใ

      ับ

     /ex

    งเ

    e \ 

    าน

     /u

     ห

    สั ง

     ใช

    รค

    หค  ม

      ท

      าง

     

    pre

    บไ

    ร ด

    p

    r/l

    “e

    แฟ

    ณลอด

      าฟ

    เว

    ssj

    ดร

    งต

    D

    คร 

    oc

    Lin

    xp

    ลก

     ซ ง

    มมล

    (ต 

     ได

    .co

    ดเ

     ไป

    ta

    อง)

    l/ 

    ux)

    es

    ปน

     ได

    นไex

    ง ๆ

     าย

    m/ 

    รว

    น  

    R

     

    ha

     

    กั

    กre

      โ

    กว

    en

     ส

    a

    re

     e

       จ

     จ

     ง

    อนss-

      ะ)

    sta

    กับ

    in

    np

    xp

    ะได

    p

     ว

    rter

    ท 

    g\n

    m”

    es

    เห

    ตั ง

     เ

    น 

     /ge

    p

    .c

     ใ

    มอ

    อา

    Ma

     

    ner

     อ

    d

    ข ัน

    ดล

    ว 

    cO

    ato

    ex

    (ใ

    ตอ

    วท

    S

    r.h

    re

    นถั

     

    รอ

    ml 

    s

    วน

    ดไ

     Li

      แ

     

     โด

     

    u

     

    ส)

     ณ

      ท 

    ซ ง

    มต

    จะ

    22

    อง

    วา

    ย 

     

  • 8/18/2019 37836

    24/55

    23

    ข ันตอนท  2

    จะใหพมพคาสั งแบบน ครับ

    express myapp

    ซ งคาสั งน จะสรางโฟลเดอร myapp โดยดผลการทางาน จากหนาจอขางลางเลยครับ 

    C:\>express myapp

    create : myapp

    create : myapp/package.json

    create : myapp/app.js

    create : myapp/public

    create : myapp/public/javascripts

    create : myapp/public/images

    create : myapp/public/stylesheets

    create : myapp/public/stylesheets/style.css

    create : myapp/routes

    create : myapp/routes/index.js

    create : myapp/routes/users.jscreate : myapp/views

    create : myapp/views/index.jade

    create : myapp/views/layout.jade

    create : myapp/views/error.jade

    create : myapp/bin

    create : myapp/bin/www

    install dependencies:> cd myapp && npm install

    run the app:

    > SET DEBUG=myapp:* & npm start

    สรางมาใหเราใชงานเสรจสรรพ

    พมพคาสั งน  ในข ันตอนท  3

    พมพคาสั งน  ในข ันตอนท  4

    ช อ โปรเจคเรา จะสรางเปนช ออะไรก ได 

  • 8/18/2019 37836

    25/55

    24

    ข ันตอนท  3

    จะให cd เขาไปในโฟลเดอร myapp ท ถกสรางข นมา (ในข ันตอนท  2)

    C:\>cd myapp

    C:\myapp>

    ซ งมันจะม โครงสรางโปรเจคดังตอไปน  

    C:\myapp>

    |-- bin

    |-- www|-- public

    |-- images

    |-- javascripts

    |-- stylesheets

    |-- style.css

    |-- routes

    |-- index.js|-- users.js

    |-- views

    |-- error.jade

    |-- index.jade

    |-- layout.jade

    |-- app.js

    |-- package.json 

     ไฟลท เหนทั งหมด เด ยวจะอธบายภายหลังนะครับ …แตจะใหลองเปดด ไฟล package.json ข นมากอน ซ งจะ

    เหนช อ dependencies ตาง ๆ แตทวามันยังไมถกดาวน โหลดมาตดตั งใหนะครับ

    ดวยเหตน เราจงตองตดตั งดวยมอตนเอง ดวยคาสั งขางลาง (เสยเวลารอนานหนอย) 

    C:\myapp>npm install

    เอาไวเกบรปภาพ, จาวาสครปต, CSS

    เปนเทมเพลตหนาเวบ

     ใชกาหนดคาเร มตนตาง ๆ ซ งภายหลังจะถกไฟล www โหลดเขาไป

    ทาตัวเปนเราเตอร (Router)

    เพ อเลอกไฟล *.jade มาแสดงผล

    ถกใชรันเปนเซรฟเวอร โดยเปดพอรต 3000 เอาไว 

  • 8/18/2019 37836

    26/55

     

    ข ั

    ข ั

    s

    ซ 

    C:

     

    >

    >

    $

    ข ั

     

    t

    จะ

     \m

    m

    no

    y

     ถา

    DE

    งเ

     ได

      EB

     ให

    ya

    a

    de

    ap

    BU

    ผล

    ท  

     จะ

      UG

    p

    p

    ./ 

    :s

     ใช

    G=

    ท  

    วบ

      ัพ

     4

    เป

      =

    พธ

    se

    0.

    in

    rv

    m

    5

    บร

     ดัง

     

      ya

    ดัง

    t

    .0

    w

    er

    ap

    วเ

    ภา

    รรั

      pp

        

    EB

    st

    w

    is

    M

      p:*

     ไ

      :*

    UG

    rt

    en

    ac

      n

     เพ 

    ล 

    n

    =

    C:\ 

      ing

    S

    m

    อก

    "w

      p

    ya

    m

      o

    หร

      st

    w

      s

      pp

    ap

      p

    rt

    U

    " ห

    art

      :*

    p

    ort

    in

     

    RL

    รอ

    n

    3

    x

    เป

      ั งใ

    p

    00

       ใ

    เอ

      เว

    s

      +

     ใช

    tt

    าไ

    บแ

    art

      m

     า

    :/ 

     d

    อพ

     งเ

    lo

    b

    ลเ

    ลา

    al

    g

    ชั 

    น 

    ho

     

    ทา

    ทน

    t:3

     

    งา

    00

     ก

    ห ใ

      กั

    ชค

     h

      าสั 

    tp

     

    ://localhos :3 00 /u er

    25

     

  • 8/18/2019 37836

    27/55

     

     ใ

    เข

     

    **

    "s

     

    กา

    หัว

    หร

    าม

    *ใ

    cri

    "s

    หร

    ขอ

    บไ

     ไฟ

    ts

    ar

    บไ

    าง

    น  

    ล 

    ล 

    : {

    ":

    ล 

      มจ

     ./ 

    ac

    no

    ap

      ะพ

    in

    ka

    de

    p.j

      าม

     w

    e.j

    ./ 

     มั

     w 

    so

    in

    รเ

    าร

     มัน

     ถ

      w

    นม

     า

    จะ

    เร

      w

    อด

    าน

    ทา

    าไป

      "

    ลต

    ขอ

    าน

    เป

    วห

    R

     โป

    เป

    ด 

       ง

    s

    e

    รเ

    เซ

     มัน

     ท  ใ

    o

    r

    u

    รฟ

    จะ

      กา

    se

    eq

    sp

    รัน

    st

    เวอ

      ั งร

      หน

    o

    ue

    on

    ob

    ap

    ร (

    นโ

      ดค

     je

    t

    se

      

     je

    รเ

      าต

    ct

    w

      t

    จค

      ง

    กว

    รต

      ว

      ใ

     

    อร

    3

    คา

      กั

     

    ตผ

    00

    สั ง

      เว

     

    Mi

    00

    มจ

    ) ซ 

      ังต

      บแ

     

    dd

    ะอ

    เบ

     อไ

      อพ

    .

     

    le

    อง

    น  

    ลเค

     /bi

     โ

     

    ar

    ยด

    ลั

    ชั น

    p

    n/ 

    หล

     

    e

    วย

    มั

    .j

     w

    รอ

    รป

    จะ

    s

     w

    r

    าพ

     

    p

    ut

    ..

    ตัว

    .js

    ing

    วกั

    อด

     

    งข

     

    p

    าง

    26

    .js

     าง

  • 8/18/2019 37836

    28/55

  • 8/18/2019 37836

    29/55

  • 8/18/2019 37836

    30/55

    29

    แตทั งน เราตองเลอกวา จะให middleware หมายเลข 4 หรอ 5 ตัวไหนมันทางาน เพราะวา

      Middleware หมายเลข 4 จะใชงานในโหมด development

      Middleware หมายเลข 5 จะใชงานในโหมด production

    การใชงานแบบ production กคอการกาหนดคาในตัวแปร NODE_ENV ซ งตองทากอนรันโปรเจค ดังน  

     ใชคาสั ง

    ***แตถาเราไม ไดกาหนดคาอะไรไวเลย กจะหมายถง development โดยดฟอลต 

    Template engine

    การใชงาน Express เราสามารถกาหนด template engine …ซ งมันเปนกลไก เอาไวใชแสดงผลบนหนาเวบ

    บราวเซอร และในไฟล app.js กจะเหนโคด 2 บรรทัด ดังน  

     // view engine setup

    app.set('views', path.join(__dirname, 'views'));

    app.set('view engine', 'jade');

     ในตัวอยางน จะใช  template engine เปน Jade ซ งจะใช ไฟลนามสกล *.jade เปนตัวแสดงผล สาหรับไฟล 

    *.jade ภายหลังจะถก render หรอแปลงรางกลายเปน HTML บนเวบบราวเซอรอกท 

    และเม อด โคดใน app.js กจะมการกาหนดคา routing เปนดังน 

    export NODE_ENV=production

    SET NODE_ENV=production

    บน OS X หรอ Linux

    บนวนโดวส 

    C:\webapp

    |-- views

    |-- error.jade

    |-- index.jade

    |-- layout.jade

     Template engine จะใชเปน jade

    จะช  ไปยังโฟลเดอร views

  • 8/18/2019 37836

    31/55

     

     v

     v

    a

    a

     โด

    r r

    p.

    p.

    ยท 

    นไ

     ถา

    ou

    se

    s

    s

    r

    ดใ

     ไฟ

    ฟล 

    เก

    tes

    rs

    ('/'

    ('/

    ut

    หเ

      i

    us

     e

    =

    r

    , r

    se

    es

    d

    ers

    rro

    re

      q

      ut

    rs',

    กับ

    ro

    x.j

    .js

    r ข 

    ui

      ire

      s);

     us

      u

    tin

     จะ

    e('

      ('./ 

     

    er

    er

    g ใ

    ะเป

     ง

     ก

    ./r

      ro

      );

    s ม

    นเ

    นต

    อค

    จะ

    ut

      te

    นจ

    ธอ

    วเ

    วา

    ตั

    s/ 

      s/u

    ะโ

    อก

     M

    in

      ser

    p

    เส

    บไ

    id

    ex'

      s');

    มา

    .u

    ปห

    le

    i

     า

    ');

    จา

    e()

    ง เ

    าเว

    a

    nde

    กไ

    พ อ

    บบ

    re

    .jad

     r

    ล .

    ดย

    re

    รา

    uti

     /r

    ระ

    nd

    เซ

    ren

    ng

    ut

     พ

    r

    อร โ

    de

    s/

    ธเ

    ดย

    r ไ

    ind

      น

    in

    ตร

    ล 

    ex

     /

    de

     เ

    err

    .js

    .ja

    น '

    or.

      แ

     /us

    de

    're

    ad

    er

     ให

    po

    e (

     ง

    ./r

     ต

    แส

    nd

    บเ

    ut

    ดง

     wi

       โค

      ก

    เจ

    es

    าด

      th

      r

    ต 

    us

     

    a r

     

    pp

    ut

    ro

    rs.

    นา

     

    es

    .js

    er

    te

     js

    เว

      ur

     อก

    ออ

    r อ

      แล

      ce'

    ทน

     ไป

    อก

    าว

     

    ะค

     

    นา

    ซอ

    บ)

     

    30

     ไป

    ร 

  • 8/18/2019 37836

    32/55

    31

    สาหรับ index.js กับ users.js เวลากาหนดใหเปน routing น ัน …ผมจะอธบายดวยภาพขางลางแลวกัน

    จากรป สามารถอธบายได โดยยอดังน  

      ถารเควสตเขามาเปน URL http://ipaddress:3000 กจะใช index.jade เปนตัวแสดงผลหนาเวบ

     

    แตถาเปน http://ipaddress:3000/users กจะสงขอความ "respond with a resource" กลับไป  แตถาเกด error ข นมา กจะใช error.jade เปนตัวแสดงผลหนาเวบ

    จะขอยอนกลับไปท  โคดในไฟล index.js กับ users.js มันจะเรยกใชออบเจกตเราเตอร (Router) ดังน  

     var router = express.Router();  // เปนออบเจกตเราเตอร 

    ….

    router.get('path', function(req, res, next) {

     /*… โคดเรา …*/

    });

     ในตัวอยางน  router นอกจากจะมเมธอด get แลว …มันยังมเมธอด post, delete และอ น ๆ ตามช อ

    METHOD ของโปรโตคอล HTTP อกดวย

    สงขอความ

    extends

    render

    ….….Response

    error.jade

    render

    routing

    Request

     / /usersMiddleware

    จัดการ error

    index.jade

    layout.jade

    "respond with a

    resource" 

    users.js index.js 

  • 8/18/2019 37836

    33/55

     

    เม

     

    <

    <

     

    y

    l>

    วา

    เอ

    ดไ

    PE

  • 8/18/2019 37836

    34/55

     

    สม

      า

    มต

     แ

    เรา

    ดง

    กร

    ผล

     xt

    UR

    n

    L

    เน 

    s

    นา

    คอ

    T

    ดเ

     มา

    คา

    'N

    ะส

    L

    าก

    อก

      e

    ot

    รา

    ข 

    ht

    หา

       

    r.

    Fo

    มา

    p:

    es

    un

      าต

     ใ

     /l

    เว

    sa

    '

    าเ

    ca

     ไ

    e

    าห

    าถ

    lh

     พ

     งใ

    ยอ

     

    ดไ

    st:

     (

    ท 

    ดใ

     

    30

    rr

    น 

      

    0

    r 4

    ท  ใ

      00

      ซ 

      ัก-

     ไฟ

    ท  ไ

    ล 

    rr

    r.j

    ข 

    d

    ตัว

     ก

     

     

    e

    กา

    ro

    รท

    .ja

    างา

    e

    นต

     ไ

    กั

    d

     กจ

    าม

     m

    บวา

    eve

    ะท

    iddl

    ะเ

    lop

    33

    ew

    en

     

    re

    rod

    t

      ัวถั

    ucti

     ไปข

    on

    นอ

    รอ

     

     

  • 8/18/2019 37836

    35/55

     

     

     าง

    เห

    E h

       

    มา

      ref 

     

    มา

      ="/s

      กม

    เว

      tyle

      าย

     ไซ

      she

      เช

    ตห

      ets/ 

      if

    ลัก

      styl

      e

    ขอ

    นา

      .cs

      lse

    เข

     

    ตา

      s"> 

    า h

     

    วบ

     

    ละ

    ttp

     H

     า

    :// 

     งอ 

    ad

    L

    e-l

      ไ

    an

     ตา

    .c

    งอ

    m

    ะไร

     

    กบั

    อง

    ภา

    ศก

    ษา

    าเ

    พ ม

    เต

    ทั ว

     ได

     ๆ

    ครั

     ไป

    34

    ดัง

     

  • 8/18/2019 37836

    36/55

     

     ใ

    (C

     ใ

     ใ

    o

    ดย

    ภา

    ภา

      าเ

    น 

    p

     EJ

    พน

    พน

    วบ

    ne

    S

     ห

       ผ

    แล

    nt)

      าเ

      าเ

    ะเ

    งม

     โด

     t

      บ

      บ

    มา

     อไ

    อด

    ยแ

    m

     ให

      ใ

    ตล

    la

    ระ

    ระ

       ม

    เป

    JS

    te

    กอ

    กอ

      นจ

    นก

    ซ ง

    มโ

     en

     ไ

     ไ

    ะเ

    รเ

    มไ

    พเ

      in

    นโ

    สย

      แ

      เ

    ยค

    ยค

    คร

    วล

     ง

     สา

    อม

    อม

    รา

    od

    เท

    นา

    มา

    พเ

    พเ

    จะ

     y

    จอ

    รถ

    นน

    นต 

    รอ

    หค

    ออ

    Ja

    ต ไ

    b

      เท

    กเ

    reu

    e

    ดแ

    dy

      เพ

     โค

    en

    ot

    o

    oo

    se

      ก 

    ลต

    ดท 

    u

    r

     y

    er

     ว

     หร

      ัน

    e

    (T

     

    าเ

     ๆ

    อน

    ะเ

    u,

    oo

    m

    สด

      

     โด

    าก

     b

    te

    pl

    งผ

     

    ยแ

    dy

     (น

    te

     

    ตล

    าใ

    , f 

    าก

     

      าเ

     

    ะช 

      งา

    ot

      ับ

     ถก

      บ

    นใ

    เซ

    er

    าใ

    ปร

    si

    แล

    ชง

    ะก

    นา

    de

    ด 

      ัน

    si

    นใ

    ถัด

    ar

    เร

     

    ดัง

    de

    หม

       น

    ป 

    ar

    อก

     

     า

     

    รั ง

    าก

    )

    คอ

     โพ

     

     โ

    เน

    เน

    35

    ต 

    นต

     

  • 8/18/2019 37836

    37/55

    36

    โปรแกรมเมอร ไทย

    ในใจนะเจบปวด

     ในตัวอยางน  ไฟล “home.ejs” จะเขยนเปนโครงรางหนาเวบเอาไวกอน โดยมันจะมนามสกล .ejs  …และคณ

    นาจะเหนแทก    ท ตกรอบสแดงใชมั  ยครับ …พวกมันจะถกแทนท ดวยแทก HTML แลวกลายเปน

    หนาเวบท สมบรณภายหลัง โดยผมจะอธบายโคดหมายเลข 1, 2, 3 ตามลาดับดังน  

     

    ตัวอยางการใช EJS

     

    ถกแทนท ดวยไฟล head_bootstrap.ejs 

     ใช bootstrap ซ งเปน CSS เฟรมเวรคยอดนยมตัวหน ง

    สาหรับเอาไวแสดงผลหนาเวบแบบ responsive ซ งตอน

    ท เขยนหนังสอยังเปนเวอรชั น 3 (เวอรชั น 4 เปน alpha)

    2

    1

    3

    1

  • 8/18/2019 37836

    38/55

  • 8/18/2019 37836

    39/55

    38

     ในตัวอยางน  จะม โครงสรางโปรเจคดังตัวอยาง 

    c:\ejs

    |-- node_modules\...

    |-- views

    |-- page

    |-- about.ejs

    |-- home.ejs

    |-- template

    |-- footer.ejs

    |-- head_bootstrap.ejs

    |-- menu.ejs

    |-- server.js

    |-- package.json

     ในตัวอยางน  ไฟล home.ejs, footer.ejs, head_bootstrap.ejs และ menu.ejs จะนามาจากหัวขอกอนหนา

    น แหละ …สวนไฟล about.ejs กับ server.js จะสรางเพ มข นมาใหมเอ อมออง ซ งจะเหนไดดังตอไปน  …

    ผมจะสรางไฟล “about.ejs” ดังน  

    น คอการใช EJS

    โดยแอดมนโฮ โอนอยออก

     ใชคาสั ง npm init –y สรางข นมา (จะสรางหรอไมก ได)

     ใช ไฟล .ejsท มอย แลว

    EJS จะเร มหาไฟล *.ejs ตาง ๆ ท อย  ในโฟลเดอร views

  • 8/18/2019 37836

    40/55

    39

     ไฟล about.ejs กมหลักการทางานเดยวกันกับ home.ejs ซ งพวกมันจะเปนหนาเวบท รางโครงข นมากอน พอ

    ถงเวลาประมวลจรง ๆ กจะนาไฟล *.ejs มาหยอดใส ใหกลายเปนหนาเวบ HTML ท สมบรณภายหลัง

    ตอมาผมจะสรางไฟล server.js ซ งโคดขางในจะเปนการใชงานมอดล Express รวมกับ EJS ดังตอไปน   var express = require('express');

     var engine = require('ejs-locals');  // ในตัวอยางน ผมจะใชมอดล ejs-locals ไม ได โหลดมอดล ejs โดยตรงนะครับ 

     var app = express();

    app.engine('ejs', engine);

    app.set('view engine', 'ejs');

    app.get('/', function(req, res) {  // ตดตอเขามาดวย http://ipadress:8080/  

    res.render('page/home');

    });

    app.get('/about', function(req, res) {  // ตดตอเขามาดวย http://ipadress:8080/about 

    res.render('page/about');

    });

    app.listen(8080, function() {  // ทาตัวเปนเซรฟเวอร และเปดพอรต 8080 console.log('Server running at http://localhost:8080/');

    });

    console.log("Using EJS example");

     ไฟล server.js จะทาตัวเปนเซรฟเวอรและเปดพอรต 8080 เม อเวบบราวเซอรตดตอเขามาดวยพาธ ไดแก /

    หรอ /about กจะนาไฟล home.js หรอ about.js ไปแสดงผลหนาเวบบราวเซอร …หรอพดอกนัยหน ง

    server.js มันทาตัวเปนทั งเซรฟเวอร และเราเตอรเพ อเลอกไฟล (*.ejs) มาแสดงผล

    แตกอนอ นอยาลมรันคาสั ง “node server.js” เพ อใหเวบแอพทางาน ดังน  

    c:\ejs>node server.js

    Using EJS example

    Server running at http://localhost:8080/

    ซ งภาพรวมของการทางานในโปรเจคน  จะเปนดังภาพในหนาถัดไป

    บอก Express วาจะใช EJS

    เปน Template egine

    นาไฟล home.js ไปแสดงผล

    นาไฟล about.js ไปแสดงผล

  • 8/18/2019 37836

    41/55

  • 8/18/2019 37836

    42/55

     

     ใ

    ท 

     โด

    อั

    W

    เซ

    เซ

    ชต

    เด

    eb

    รฟ

    รฟ

    าก

     ง

    น 

    ดต

    e

    ยว

    So

    เว

    เวอ

     ให

    (หร

    ะแ

    อส 

    bS

      ย

    ke

    ร 

    คณ

    สด

    c

      สั

    t

    ละ

      รอ

    ลอ

    ef

    ตัว

    รร

    et

    อม

      สน

    มข

      เรา

      เซ

    งน

    res

    H

    อย

    ะห

    ลท 

      กัน

    อเ

      กใ

    ฟเ

    ถง

    h

     T

    าง

     าง

     สง

      )

      เจ

     โป

    วเ

     C

    าร

     ไค

     อง

    บเ

    าท

    สง

    รโต

    ง)

    lie

    สร

    เอ

      ย

    อน 

    คอ

    แล

      t 

    งเ

    ต 

    กา

    จะ

    น แ

    าไ

    วถ

     

      อม

    เม อ

     (H

    รต

    ว ง

    มอ

    คล

     T

    นา

      ั งเป

    นาย

    ฝ งใ

     T

    ย 

    นก

     ส

    อน

    L

    ขอ

    ดกา

    และ

    นะ .

     

      ปด

     C

    ส 

    นโ

    บท

      งข

    ต 

    เว

    มล

    รตด

    สงข

      อ .

    อน

    ...ซั

    an

      การ

    เค

      lie

    สา

    ปร

     อท 

      ม

      ว

    าท 

    จา

    ตอค

    อมล

    ..ฉัน

    น นา

    พอ

    dsh

    ดต

    ช ัน

      t)

    รแ

     เป

      ไป

    ทอ

    หน

    เซ

    างท

     ไปก

      ัพพ

    ยตด

     ต

    ke

    แบ

      แล

    อล

    คา

      กล

    สง

    าเว

     ฟเ

    งไว 

    ลับไ

    อรต

    ตอเ

    eb

     (HT

    งทา

    บเ

    ะเซ

     T

     

    งไ

      บห

    บส

    วอ

    Per

    ดสอ

     W

      าม

    oc

    P

    งกา

    รฟ

    ll-

      ากั

    งอั

    งรเ

      ม

    sist

    งทศ

    bS

     ได

    et

    pd

    ส อ

     ไท

    เวอ

    du

     อก

     อเ

      ไ

    เด

    คว

    าแ

    nt

    ทาง 

    cke

    ลว

    รอเ

      te)

    าร

    เร

    ม 

    ร (

    le

       

       อ

      2

    ยว

    ดง

      on

    t

    ะโว

    ปลา

     

    จะ

    วย

    HT

    าม

     

    ผล

      nec

    วะ

    ดตั

     ไ

    กา

     TP

    ตด

    รป

    ระ

      ท

     ถา

    าเ

    บน

      ion

    ลง 

     ใช

     Se

    ตอ

      า

    หว

    ทา

    ฝ ง

    หน

     

       

    W

    rve

    ส อ

    ลา

    างไ

    ง ไ

      ดป

    เว

    าเว

    eb

    r)

    สา

    ง (

    คล

    มว

      ดท

    ร 

    o

     ได

    มัน

      อก

     

    ke

    2

    ม ใ

    ต 

    เป

      อน

    าเว

    t ซ 

      ทศ

    ช โ

    เว

      ไ

      จ

    บจ

    จะ

     อ

    งเป

    ทา

    รโ

      ลเ

      ค

    ะต

    ชม

    อง

    บบ

    นโ

    งบ

    ตค

    าว

      อน

      กัน

    อด

    กา

    W

    รโ

     s

    ซอ

      ส

      ไม

    ระ

    ล s

    eb

    ตค

    oc

    HT

    ร)

     ไป

      ด 

    พร

    oc

    o

    41

    อล

    et

     TP

    กับ

      หา

     

    ket

    ส อ

    ke

     

    .io

    สา

    t

  • 8/18/2019 37836

    43/55

    42

    แตถาใช WebSocket เราสามารถตดตอแลกเปล ยนขอมลกับเซรฟเวอร โดยไมตอง refresh หนาเวบ จรง ๆ

    แลวมันจะคลายกับ AJAX แตจะมประสทธภาพดกวาเยอะ (คาวา AJAX นาจะเขาใจกันอย แลวเนอะ)

    *** ถาใครใช HTML5 มากอน กนาจะเคยเหนการใช WebSocket มาแลว ซ งมหลักการเดยวกันแหละครับ

    มอดล socket.io

    การใชงาน WebScoket ใน Node.js สามารถใช socket.io แตเราตองตดตั งมันกอนดวยคาสั ง

    npm install socket.io --save

    หลังจากน ตอไป ผมจะอธบายการเขยนโคดทละข ันตอนแลวกัน ดังรายละเอยดตอไปน  

    ข ันท  1

    เม อตดตั งมอดลเสรจเรยบรอย กจะใหเขยนโคดจาลองเซรฟเวอร และเปดพอรตข นมา (เปนอะไรกได) เพ อใช

    ตดตอส อสารแบบ WebSocket ดังน  

     var io = require('socket.io').listen(8080);  // จะจาลองเซรฟเวอร และเปดพอรต 8080 คางไว 

    ข ันท  2

    ผมจะเพ มซอรสโคดในฝ งไคลเอนต (ในไฟล HTML) กับฝ งเซรฟเวอร ดังน 

    จากโคดท ยกมาใหด เวลาไคลเอนตตดตอเขามาเปน URL ธรรมดา ไดแก http://localhost:8080  …เม อน ัน

    คอลแบคของเมธอด on()  ในฝ งเซรฟเวอร กจะถกเรยกใหทางาน 

     // ฝ งเซรฟเวอร 

    io.sockets.on('connection', function (socket) { // เม อไคลเอนตตดตอเขามา

     // โคดสวนน กจะทางาน

    });

     // ฝ งไคลเอนต 

    io.connect('htt ://localhost:8080');  WebSocket

    เกดเหตการณ 'connection'

  • 8/18/2019 37836

    44/55

    43

    ข ันตอนท  3

    ผมจะแสดงใหเหนวา เวลาไคลเอนตกับเซรฟเวอรสงขอมลไปมาหาส กัน จะมวธเขยนโคดดังตอไปน  

    ตองเขาใจอยางน นะครับ มอดล socket.io จะใชกลไกตดตอส อสารเปนแบบ message-oriented หรอกคอ

    สงเปนขอความธรรมดาไดเลย โดยเบ องหลังมันจะแอบใช WebSocket อกทหน ง (สบายแฮะ)

    จากโคดตัวอยางดังกลาว เวลาสงขอความและรับขอความ กสามารถทาไดดังน  

     

    การสงขอความไปใหอกฝ งหน ง จะใชเมธอด emit()  สวนอกฝ งเม อรับขอความ กจะใชเมธอด on()

    แตทั งน ขอความท สงหากัน คณจะตองระบช อเหตการณเปนอะไรก ไดดวยนะ หรออาจมองวาเปนการตดฉลาก

    เขาไปก ได ดังตัวอยาง

    ประโยค socket.emit('clientChat', 'Hi server'); ในฝ งไคลเอนต

    จะสงขอความ 'Hi server' ดวยการระบช อเหตการณเปน

    'clientChat'

    ประโยค socket.on('clientChat', function(content){…} ); ในฝ งเซรฟเวอร 

    คอลแบคจะรับขอความผานทางตัวแปร content แตตองมช อเหตการณเปน

    'clientChat'

     // ฝ งเซรฟเวอร

    io.sockets.on('connection', function (socket) {

    socket.on('clientChat', function(content) {

    console.log(content);

    });

    socket.emit('serverChat', "I'm OK");

    }); 

    พารามเตอร socket จะรับคาเปน

    ออบเจกตท มเมธอด on กับ emit // ฝ งไคลเอนต

     var socket =

    io.connect('http://localhost:8080');

    socket.emit('clientChat', 'Hi server');

    socket.on('serverChat', function(content) {

     // console.log(content)

    }); 

    ออบเจกต socketจะมเมธอด on กับ emit

    คอนเซปทคลาย ๆEmitter pattern

  • 8/18/2019 37836

    45/55

    44

    ขณะเดยวกันเหตการณ  "serverChat" กจะมหลักเกณฑทางานเดยวกัน แตมันจะทางานกลับดานกัน …กคอ

    ฝ งเซรฟเวอรจะเปนคนสงขอความมาหาไคลเอนตเอง

    ข ันตอนท  4

    จากข ันตอนท  1 – 3 ผมจะรวบยอดเขยนเปนโคดในฝ งไคลเอนต (HTML) กับฝ งเซรฟเวอร ดังน  

     

    Socket.IO example

     var div = document.querySelector('#div1') ;

     var socket = io.connect('http://localhost:8080');  // ตดตอกับเซรฟเวอร ดวยโปรโตคอล WebSocket 

    socket.emit('clientChat', 'Hi server');  // สงขอความไปใหเซรฟเวอร 

    socket.on('serverChat', function(content) {  // รับขอความมาจากเซรฟเวอร div.innerHTML = content;  // นาขอความท  ไดรับมาแทรกลงในแทก  

    });

     // ไฟล server.js

     var io = require('socket.io').listen(8080);  // จะจาลองเซรฟเวอร และเปดพอรต 8080 คางไว (เปน WebSocket) 

    io.sockets.on('connection', function (socket) {  // เม อหนาเวบตดตอเขามาครั งแรก คอลแบคกจะถกเรยกใหทางาน 

    socket.on('clientChat', function(content) {  // รับขอความมาจากหนาเวบ 

    console.log(content);

    });

    socket.emit('serverChat', "I'm OK");  // สงขอความไปใหหนาเวบ 

    });

    console.log('Server running at http://localhost:8080/');

    ตองระบวาจะใช socket.io

     ในไฟล HTML

  • 8/18/2019 37836

    46/55

     

     ไ

    C:

     

    เม 

    C:S

     ใ

    เซ

     \w

     

    อพ

     \wrv

      ังจ

      า

    ภา

    รฟ

     ถา

    งส

    eb

      |-  |-

      |-

      |--

    มพ

    ebr

    าก

    อค

    พจ

    เวอ

    เรา

    อง

    oc

     n _ p

     in

     se

    คา

    ocun

    น ัน

    อน

    ะเ

    ร เ

    กร

    พร

    ke

    d _ck 

    de

    rve

      ั ง

    kenin

     โซ

       อ

    อก

    าะ

     ยก

    _ag

    .h

    r.js

    “n

    >ng

    บเ

     ใน

    าร

    แล

     U

      ซร

    มา

    _ o.js

    m

     

    d

    odt

      ล

    ฝ ง

    เป

    เป

    L เ

      เว

    _ ulon

    l

    s

    ett

    คล

    ซร

     ไฟ

    ล ย

    ปน

      อร

    (i

    _ es 

    rv

    er  :// 

     ไฟ

    เว

    ล i

      h

      ัน

    d

    ...

    er.j

    er  lo

    ล 

    อร 

    d

    tt

      ปด

    x.

    s”

    .jsal

    C:\ 

     ดัง

    x.

    าม

    :/ 

      พ

    t

    กจ

     os

     we

    น  

    t

     ได

    lo

      รต

    l

    ะแ

      t:8

    bs

    l

    แก

    al

      80

      08

    c

      จ

    os

    80

    ser

    ผล

       /

    et

    าน

    i s

    t:8

     เป

    ve

    ลัพ

     

    in

    er

    08

     โ

    .js)

    ธดั

    de

    er

     /  

    รโ

    จะ

    น  

    .h

     

    กั

    อย 

     

    t

      คร

    เว

      ใน

    l เ

    I’

    W

    ปร

       อ

     งจ

     

    าว

    bS

    เจ

    เป

    ะห

      K”

    เซ

    oc

    ท ม

    มัน

      ซ ง

    ket

     โค

    ข น

    ถง

    กัน

      ท

    งส

    มา

    แล

      ก

    ตเ

    รา

     ซ ง

      ไค

    ะกั

      รดั

    รา

    ดัง

    ลเ

     

    บเ

    มว

    น 

    จะ

      ล

    ธแ

     

    เห

     ส

      ลก

    กดั

    งต

      ไฟ

      าจ

    วต

      ล จ

    าถ

    อเ

      ะท

    ดไ

     ไ

      าไ

     

    45

    กับ

    ยัง

       ได

     

  • 8/18/2019 37836

    47/55

    46

    ตัวอยางโคดตอไปน  จะนาไฟล server.js มาแก ไขเสยใหม ดวยการผสมผสานวธ ใชงานมอดล Express รวมกับ

    socket.io และเพ อไม ใหเปนการเสยเวลา ก ใหคณด โคดดกวาจะไดเขาใจไปเลย ดังตัวอยาง

     // ไฟล server.js

     var fs = require('fs');  // มอดล fs 

     var app = require('express')();

     var server = require('http').createServer(app);

     var io = require('socket.io')(server);

    server.listen(8080);  // จะจาลองเซรฟเวอร ดวยการเปดพอรต 8080 

    app.get('/', function(req, res) {

    fs.readFile(__dirname + '/index.html',  // อานไฟล index.html function(err, data) {

    if (err) {

    res.writeHead(500);

    return res.end('Error loading index.html');

    }

    res.writeHead(200);

    res.end(data);} // ส นสดคอลแบค 

    ); // ส นสด readFile() 

    });

    io.sockets.on('connection', function (socket) {

    socket.on('clientChat', function(content) {

    console.log(content);

    });socket.emit('serverChat', "I'm OK");

    });

    console.log('Server running at http://localhost:8080/');

     ในตัวอยางน คอนเซปทกคอ จะเปดพอรต 8080 คางเอาไว และแทนท คณจะเปดไฟล  index.html (ไฟลเดม)

    กเปล ยนไปเปดเวบบราวเซอร แลวกรอก URL เปน http://localhost:8080/  ไมเพยงเทาน ันพอรตน ยัง

    รองรับโปรโตคอล WebSocket ไดอกดวย

    เคลดกระบวนทาผสานรวม

    Express เขากับ socket.io

     ใหกลายเปนหน ง

     โคดเหมอนตัวอยางท แลวเปะ

    อานเน อหาในไฟล index.html

    แลวสง data (Buffer) กลับออกไปหาไคลเอนต

  • 8/18/2019 37836

    48/55

     

    เม 

    เว

    ดั

     

    ht

     

     ท

    อเ

    ภา

    หร

    tp:

     าโ

    พข

    เห

    บร

     //s

      ดใ

    รา

      ังจ

    าง

    ต   

    าย

    oc

    เซ

    าก

     าง

    ะเ

    et

    er

    อร

      ั น

     

      ย

    .io

    er

     งร

    .js

    เค

    าเว

      ัน

    สต

    บจ

    oc

    กร

      ับ

    มา

    ะต

    ket

    อก

      อ

    ยังเ

    .io

    U

    ซร

    มา

     มา

    L

     พ

    เว

    หา

    กก

    คว

    อร 

    เซ

     

    วา

    ตร

    ร เ

     ใน

    ฟเ

     

      ถ

     se

      าส

      ะว

    rve

     ให

      ใจ

      า…

    r.js

     อ

      กอ

     

    านเ

    ตอ

    งด

    พ ม

    งอ

    วย

    เต

    W

     ได

    ฟล 

    b

    ท  

    in

    oc

    de

    ke

    .h m

    ดย

    l แ

    ผล

      ว

    กา

     งก

    ทา

    ลับ

    งา

    งห

    ะเ

    47

    นา

      น

     

  • 8/18/2019 37836

    49/55

    48

    ตดตอฐานขอม  ล MySQL

    ….เอาละแตกอนอ นเราตองตดตั งมอดล mysql ข นมากอน ดวยคาสั ง

    npm install mysql --save

    *** สาหรับวธตดตั ง MySQL ก ให ไปดวธตดตั งไดท  www.patanasongsivilai.com/itebook_form.html 

     โคดตอไปน จะใชตดตอฐานขอมลเปน MySQL

     var mysql = require('mysql');  // โหลดมอดล mysql 

     var connection = mysql.createConnection({

    host : 'localhost',

    u