標籤

BAT (38) shell (34) Virtual Machine (33) Xubuntu (29) acfs (25) PHP (24) CentOS (21) Virtul Box (20) 編輯器 (17) 資料庫 (15) lubuntu (13) windows (13) CPP (12) ubuntu (12) chrome (11) laravel (10) Docker (9) Python (9) 5A88 (7) VMware (6) 資料結構 (6) Javascript (5) Node (5) Proxmox VE (5) 公告系統 (5) 程式積木 (5) Android Studio (4) ANN (3) OB2D2016x64 (3) Xoops (3) clonezilla (3) samba (3) 公文 (3) 其他 (3) 硬體 (3) API (2) Android (2) AppInvent2 (2) Html (2) Hyper-V (2) Nas (2) botnet (2) mbot (2) swift (2) wordpress (2) 樣板 (2) 防火牆 (2) AD的應用 (1) Ansible (1) Arduino (1) CSS (1) GitLab (1) HA Proxy (1) LegoEV3 (1) PowerShell (1) Scratch (1) VM (1) XenServer (1) kotlin (1) linuxmint (1) lxc (1)

2020年3月9日 星期一

Nodejs 入門 筆記整理及心得

第一次看完 Node 入門,心裡只有驚呼!!哇!!但是對整個程式碼,並沒有很清楚,只殘留驚呼。於是,開始動起手來整理整個程式碼。希望能加深自己的印象。

1.第一個程式HelloWorld.js
   檔名:HelloWorld.js
   內容:console.log('Hello World');

2.一個完整的Node.js的Web應用
   目標:
    .用戶可以透過瀏覽器使用我們的應用。
    .當用戶請求http://domain/start時,可以看到一個歡迎頁面,頁面上有一個檔案上傳的表
     單。
    .用戶可以選擇一個圖片並送出表單,隨後檔案將被上傳到      http://domain/upload,該頁
     面完成上傳後會把圖片顯示
   (1)一個基礎的http伺服器腳本
        檔名:server.js
        內容:
        var http = require('http');

        http.createServer(function(request,response){
            console.log('Request received.');
            response.writeHead(200,{'Content-Type':'text/plain'});
            response.write('Hello World');
            response.end();
        }).listen(8888);
     
        console.log('Server has started');
   (2)一個基礎的http伺服器腳本(不同寫法)
        檔名:server.js
        內容:
        var http = require('http');

        function onRequest(request,response) {
              console.log('Request received.');
              response.writeHead(200,{'Content-Type':'text/plain'});
              response.write('Hello World');
              response.end();
        }
       
         http.createServer(onRequest).listen(8888);   
         console.log('Server has started');

     (3)一個基礎的http伺服器腳本放進函數start(),並匯出函數start()
        檔名:server.js
        內容:
        var http = require('http');

       function start() {       
          http.createServer(function(request,response){
            console.log('Request received.');
            response.writeHead(200,{'Content-Type':'text/plain'});
            response.write('Hello World');
            response.end();
          }).listen(8888);
     
        console.log('Server has started');
      }
      exports.start = start;
     
        檔名:index.js
        內容:
        var server = require('./server');     
        server.start();

   (4)一個基礎的http伺服器腳本(不同寫法)放進函數start(),並匯出函數start()
      檔名:server.js
      內容:
       var http = require('http');
     
       function start() {
          function onRequest(request,response) {
                console.log('Request received.');
                response.writeHead(200,{'Content-Type':'text/plain'});
                response.write('Hello World');
                response.end();
          }
       
         http.createServer(onRequest).listen(8888);   
         console.log('Server has started');
      }

      exports.start = start;

        檔名:index.js
        內容:
        var server = require('./server');     
        server.start();

3.路由
   (1)能找出瀏覽器請求的URL路徑的http伺服器腳本,並匯出函數start(),再加入加入路由
      檔名:server.js
      內容:
       var http = require('http');
       var url = require('url');
     
       function start(route) {       
          http.createServer(function(request,response){
            var pathname = url.parse(request.url).pathname;
            console.log('Request received.');
            route(pathname);
            response.writeHead(200,{'Content-Type':'text/plain'});
            response.write('Hello World');
            response.end();
          }).listen(8888);
     
        console.log('Server has started');
      }
      exports.start = start;

        路由擴充到index.js
        檔名:index.js
        內容:
        var server = require('./server');
        var router = require('./router');
   
        server.start(router.route);

        檔名:router.js
        內容:
        function route(pathname) {
             console.log('About to route a request for' + pathname);
        }
        exports.route = route;

  (2)能找出瀏覽器請求的URL路徑的http伺服器腳本(不同寫法),並匯出函數start(),再加入加入路由
      檔名:server.js
      內容:
       var http = require('http');
       var url = require('url');
     
       function start(route) {
          function onRequest(request,response) {
                var pathname = url.parse(request.url).pathname;
                console.log('Request received.');
                route(pathname);
                response.writeHead(200,{'Content-Type':'text/plain'});
                response.write('Hello World');
                response.end();
          }
       
         http.createServer(onRequest).listen(8888);   
         console.log('Server has started');
      }

      exports.start = start;

        路由擴充到index.js         
        檔名:index.js
        內容:
        var server = require('./server');
        var router = require('./router');
   
        server.start(router.route);

        檔名:router.js
        內容:
        function route(pathname) {
             console.log('About to route a request for' + pathname);
        }
        exports.route = route;

  (3)新增請求處理程序requestHandlers 模組,並匯出 start()、upload()。
       檔名:requestHandlers.js
       內容:
       function start() {
            console.log("Request handler 'start' was called.");
       }
       function upload() {
             console.log("Request handler 'upload' was called.");
       }
       exports.start = start;
       exports.upload = upload;

  (4)將requestHandlers 模組,引入到 index.js 中:
        檔名:index.js
        內容:
        var server = require('./server');
        var router = require('./router');
        var requestHandlers = require('./requestHandlers');   

        var handle = {}
        handle['/'] = requestHandlers.start;
        handle['/start'] = requestHandlers.start;
        handle['/upload'] = requestHandlers.upload;
        server.start(router.route,handle);

   (5)將requestHandlers 模組,當成參數傳遞給伺服器。
       檔名:server.js
       內容:
       var http = require('http');
       var url = require('url');
     
       function start(route,handle) {       
          http.createServer(function(request,response){
            var pathname = url.parse(request.url).pathname;
            console.log('Request received.');
            route(handle,pathname);
            response.writeHead(200,{'Content-Type':'text/plain'});
            response.write('Hello World');
            response.end();
          }).listen(8888);
     
        console.log('Server has started');
      }
      exports.start = start;

     或者

       檔名:server.js  (不同寫法)
       內容:
       var http = require('http');
       var url = require('url');
     
       function start(route,handle) {
          function onRequest(request,response) {
                var pathname = url.parse(request.url).pathname;
                console.log('Request received.');
                route(handle,pathname);
                response.writeHead(200,{'Content-Type':'text/plain'});
                response.write('Hello World');
                response.end();
          }
       
         http.createServer(onRequest).listen(8888);   
         console.log('Server has started');
      }

      exports.start = start;

  (6)將requestHandlers 模組,當成參數傳遞給路由。
        檔名:router.js
        內容:
        function route(handle,pathname) {
             console.log('About to route a request for' + pathname);
             if (typeof handle[pathname] === 'function') {
                handle[pathname]();
             } else {
                console.log('No request handler found for ' + pathname);
             }
        }
        exports.route = route;

    (7)


另外,阻塞處理與非阻塞處理程式碼範例
檔名:testBlock.js
/*阻塞處理*/
function testok01() {
   var st01 = new Date().getTime();
   while (new Date().getTime() < st01 + 3000); 
}
testok01();
console.log("testok01 finish!!");
console.log("Block !!");


檔名:testNonBlock.js
/*非阻塞處理*/
function testok01(ok) {
     setTimeout(() => {
        ok();
     },3000);
}
testok01(function () {
     console.log("testok01 finish!!");
});
console.log("NonBlock !!");

資料來源:
1.Node 入門
2.<<Node 入門>>學習
3.04★Node.js学习★非阻塞处理好难懂
4.Callback(回調)
5.同步(Synchronous)、異步(Asynchronous)、阻塞(Block)、非阻塞(Non-block)

沒有留言:

張貼留言

在 Windows 10 x64 1909版,使用BAT快速安裝公文系統與人事服務網(自然人憑證)版

相關內容移往 https://skjhcreator.blogspot.com/2021/02/windows-10-x64-1909bat.html