• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • node.js基礎回顧

    標簽: node.js基礎

    Node.js 應用是由哪幾部分組成的:

    • 引入 required 模塊:我們可以使用 require 指令來載入 Node.js 模塊。
    • 創建服務器:服務器可以監聽客戶端的請求,類似于 Apache 、Nginx 等 HTTP 服務器。
    • 接收請求與響應請求: 服務器很容易創建,客戶端可以使用瀏覽器或終端發送 HTTP 請求,服務器接收請求后返回響應數據。

    創建簡單Node.js 應用示例
    步驟一:引入 required 模塊

    var http = require("http");
    

    步驟二:創建服務器

    var http = require('http');
    http.createServer(function (request, response) {
    // 發送 HTTP 頭部 
    // HTTP 狀態值: 200 : OK
    // 內容類型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 發送響應數據 "Hello World"
    response.end('Hello World\n');
    }).listen(8888);
    // 終端打印如下信息
    console.log('Server running at http://127.0.0.1:8888/'); 
    

    步驟三:使用 node 命令執行以上的代碼:

    node server.js
    Server running at http://127.0.0.1:8888/
    

    步驟四:打開瀏覽器訪問 http://127.0.0.1:8888/,你會看到一個寫著 "Hello World"的網頁。

    分析Node.js 的 HTTP 服務器:

    • 第一行請求(require)Node.js 自帶的 http 模塊,并且把它賦值給 http 變量。
    • 接下來我們調用 http 模塊提供的函數: createServer 。這個函數會返回 一個對象,這個對象有一個叫做 listen 的方法,這個方法有一個數值參數, 指定這個 HTTP 服務器監聽的端口號。

    Node.js REPL(交互式解釋器)
    Node 自帶了交互式解釋器,可以執行以下任務:

    • 讀取 - 讀取用戶輸入,解析輸入了Javascript 數據結構并存儲在內存中。
    • 執行 - 執行輸入的數據結構
    • 打印 - 輸出結果
    • 循環 - 循環操作以上步驟直到用戶兩次按下 ctrl-c 按鈕退出。

    Node 的交互式解釋器可以很好的調試 Javascript 代碼。

    REPL 命令
    ctrl + c - 退出當前終端。
    ctrl + c 按下兩次 - 退出 Node REPL。
    ctrl + d - 退出 Node REPL.
    向上/向下 鍵 - 查看輸入的歷史命令
    tab 鍵 - 列出當前命令

    .help - 列出使用命令
    .break - 退出多行表達式
    .clear - 退出多行表達式
    .save filename - 保存當前的 Node REPL 會話到指定文件
    .load filename - 載入當前 Node REPL 會話的文件內容。
    按下兩次 ctrl + c 鍵就能退出 REPL
    

    Node.js 回調函數

    • 阻塞代碼
      創建一個文件 input.txt ,內容自定義。
      創建 main.js 文件, 代碼如下:
    var fs = require("fs");
    var data = fs.readFileSync('input.txt');
    console.log(data.toString());
    console.log("程序執行結束!");
    
    • 非阻塞代碼
      創建一個文件 input.txt ,內容自定義。
      創建 main.js 文件, 代碼如下:
    var fs = require("fs");
    fs.readFile('input.txt', function (err, data) {
        if (err) return console.error(err);
        console.log(data.toString());
    });
    console.log("程序執行結束!");
    

    第一個實例(阻塞)在文件讀取完后才執行完程序。 第二個實例(非阻塞)不需要等待文件讀取完,這樣就可以在讀取文件時同時執行接下來的代碼,大大提高了程序的性能。阻塞是按順序執行的,而非阻塞是不需要按順序的,所以如果需要處理回調函數的參數,我們就需要寫在回調函數內。

    Node.js 事件循環

    • Node.js 是單進程單線程應用程序,但是因為 V8 引擎提供的異步執行回調接口,通過這些接口可以處理大量的并發,所以性能非常高。
    • Node.js 幾乎每一個 API 都是支持回調函數的。
    • Node.js 基本上所有的事件機制都是用設計模式中觀察者模式實現。
    • Node.js 單線程類似進入一個while(true)的事件循環,直到沒有事件觀察者退出,每個異步事件都生成一個事件觀察者,如果有事件發生就調用該回調函數.

    Node.js EventEmitter
    EventEmitter 類
    events 模塊只提供了一個對象: events.EventEmitter。EventEmitter 的核心就是***事件觸發與事件監聽器功能的封裝***。可以通過require(“events”);來訪問該模塊。

    // 引入 events 模塊
    var events = require('events');
    // 創建 eventEmitter 對象
    var eventEmitter = new events.EventEmitter();
    

    Node.js Buffer(緩沖區)
    JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。但在處理像TCP流或文件流時,必須使用到二進制數據。因此在 Node.js中,定義了一個 Buffer 類,該類用來***創建一個專門存放二進制數據的緩存區***。一個 Buffer 類似于一個整數數組,它對應于 V8 堆內存之外的一塊原始內存。

    Node.js Stream(流)
    Stream 是一個抽象接口,Node 中有很多對象實現了這個接口。例如,對http 服務器發起請求的request 對象就是一個 Stream,還有stdout(標準輸出)。Node.js,Stream 有四種流類型:
    Readable - 可讀操作。
    Writable - 可寫操作。
    Duplex - 可讀可寫操作.
    Transform - 操作被寫入數據,然后讀出結果。
    所有的 Stream 對象都是 EventEmitter 的實例。常用的事件有:
    data - 當有數據可讀時觸發。
    end - 沒有更多的數據可讀時觸發。
    error - 在接收和寫入過程中發生錯誤時觸發。
    finish - 所有數據已被寫入到底層系統時觸發。

    Node.js模塊系統
    一個 Node.js 文件就是一個模塊,這個文件可能是JavaScript 代碼、JSON 或者編譯過的C/C++ 擴展。

    //hello.js 模塊
    function Hello() { 
        var name; 
        this.setName = function(thyName) { 
            name = thyName; 
        }; 
        this.sayHello = function() { 
            console.log('Hello ' + name); 
        }; 
    }; 
    module.exports = Hello;
    
    //main.js 調用hello.js模塊(hello.js和node.js是在兩個不同的js文件中)
    var Hello = require('./hello'); 
    hello = new Hello(); 
    hello.setName('BYVoid'); 
    hello.sayHello(); 
    

    Node.js 函數
    在JavaScript中,一個函數可以作為另一個函數的參數。我們可以先定義一個函數,然后傳遞,也可以在傳遞參數的地方直接定義函數。
    Node.js中函數的使用與Javascript類似。

    //把 say 函數作為execute函數的第一個變量進行了傳遞
    function say(word) {
      console.log(word);
    }
    function execute(someFunction, value) {
      someFunction(value);
    }
    execute(say, "Hello");
    

    匿名函數
    我們可以把一個函數作為變量傳遞。但是我們不一定要繞這個"先定義,再傳遞"的圈子,我們可以直接在另一個函數的括號中定義和傳遞這個函數:

    //execute 接受第一個參數的地方直接定義了我們準備傳遞給 execute 的函數。用這種方式,我們甚至不用給這個函數起名字,這也是為什么它被叫做匿名函數 。 
    function execute(someFunction, value) {
      someFunction(value);
    }
    execute(function(word){ console.log(word) }, "Hello");
    

    函數傳遞是如何讓HTTP服務器工作的

    //我們向 createServer 函數傳遞了一個匿名函數。 
    var http = require("http");
    http.createServer(function(request, response) {
      response.writeHead(200, {"Content-Type": "text/plain"});
      response.write("Hello World");
      response.end();
    }).listen(8888);
    

    Node.js 全局對象
    在瀏覽器 JavaScript 中,通常 window 是全局對象, 而 Node.js 中的全局對象是 global

    • __filename 表示當前正在執行的腳本的文件名。它將輸出文件所在位置的絕對路徑,且和命令行參數所指定的文件名不一定相同。
    • __dirname 表示當前執行腳本所在的目錄。
    • setTimeout(cb, ms) 全局函數在指定的毫秒(ms)數后執行指定函數(cb)。:setTimeout() 只執行一次指定函數。返回一個代表定時器的句柄值。
      -clearTimeout( t ) 全局函數用于停止一個之前通過 setTimeout() 創建的定時器。 參數 t 是通過 setTimeout() 函數創建的定時器。
    • setInterval(cb, ms) 全局函數在指定的毫秒(ms)數后執行指定函數(cb)。返回一個代表定時器的句柄值。可以使用 clearInterval(t) 函數來清除定時器。setInterval() 方法會不停地調用函數,直到 clearInterval() 被調用或窗口被關閉。
    • console 用于提供控制臺標準輸出
    • process 是一個全局變量,即 global 對象的屬性。它用于描述當前Node.js 進程狀態的對象,提供了一個與操作系統的簡單接口。

    Node.js 常用工具

    • util.inherits(constructor, superConstructor)是一個實現對象間原型繼承 的函數。僅僅繼承了原型中定義的函數,而構造函數內部創造的屬 性和 函數都沒有繼承。
    • util.inspect(object,[showHidden],[depth],[colors])是一個將任意對象轉換 為字符串的方法,通常用于調試和錯誤輸出。
    • util.isArray(object)如果給定的參數 “object” 是一個數組返回true,否則返回false。
    • util.isRegExp(object)如果給定的參數 “object” 是一個正則表達式返回true,否則返回false。
    • util.isDate(object)如果給定的參數 “object” 是一個日期返回true,否則返回false。
    • util.isError(object)如果給定的參數 “object” 是一個錯誤對象返回true,否則返回false。

    Node.js 文件系統
    異步的 fs.readFile() 和同步的 fs.readFileSync()。

    • 異步模式下打開文件:fs.open(path, flags[, mode], callback)
    • 異步模式下獲取文件信息:fs.stat(path, callback)
    • 異步模式下寫入文件:fs.writeFile(file, data[, options], callback)
    • 異步模式下讀取文件:fs.read(fd, buffer, offset, length, position, callback)
    • 異步模式下關閉文件:fs.close(fd, callback)
    • 異步模式下截取文件:fs.ftruncate(fd, len, callback)
    • 刪除文件:fs.unlink(path, callback)
    • 創建目錄:fs.mkdir(path[, mode], callback)
    • 讀取目錄:fs.readdir(path, callback)
    • 刪除目錄:fs.rmdir(path, callback)

    使用 Node 創建 Web 服務器

    var http = require('http');
    var fs = require('fs');
    var url = require('url');
    // 創建服務器
    http.createServer( function (request, response) {  
    // 解析請求,包括文件名
       var pathname = url.parse(request.url).pathname;   
       // 輸出請求的文件名
       console.log("Request for " + pathname + " received.");   
       // 從文件系統中讀取請求的文件內容
       fs.readFile(pathname.substr(1), function (err, data) {
          if (err) {
             console.log(err);
             // HTTP 狀態碼: 404 : NOT FOUND
             // Content Type: text/plain
             response.writeHead(404, {'Content-Type': 'text/html'});
          }else{             
             // HTTP 狀態碼: 200 : OK
             // Content Type: text/plain
             response.writeHead(200, {'Content-Type': 'text/html'});             
             // 響應文件內容
             response.write(data.toString());
    
    index.html 文件
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鳥教程(runoob.com)</title>
    </head>
    <body>
        <h1>我的第一個標題</h1>
        <p>我的第一個段落。</p>
    </body>
    </html>          
              }
              //  發送響應數據
              response.end();
           });   
        }).listen(8080);
         // 控制臺會輸出以下信息
        console.log('Server running at http://127.0.0.1:8080/');
    

    使用 Node 創建 Web 客戶端
    Node 創建 Web 客戶端需要引入 http 模塊,創建 client.js 文件,代碼如下所示:

    var http = require('http'); 
    // 用于請求的選項
    var options = {
       host: 'localhost',
       port: '8080',
       path: '/index.html'  
    }; 
    // 處理響應的回調函數
    var callback = function(response){
       // 不斷更新數據
       var body = '';
       response.on('data', function(data) {
          body += data;
       });   
       response.on('end', function() {
          // 數據接收完成
          console.log(body);
       });
    }
    // 向服務端發送請求
    var req = http.request(options, callback);
    req.end();
    

    新開一個終端,執行 client.js 文件,輸出結果如下:

    $ node  client.js     
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鳥教程(runoob.com)</title>
    </head>
    <body>
        <h1>我的第一個標題</h1>
        <p>我的第一個段落。</p>
    </body>
    </html>
    
    版權聲明:本文為qq_34273059原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_34273059/article/details/82775259

    智能推薦

    node.js基礎了解

    node.js的特點 單線程:只有一個線程執行任務 非堵塞I/O:在I/O耗時操作時,線程不堵塞 事件驅動:使用事件驅動程序往下繼續運行 node,js模塊化 規范:遵循common.js規范     加載模塊的時候同步。當遇到require() 語句時,會停下來等加載完成然后繼續往下執行。     暴露模塊的時候推薦...

    node.js基礎入門

    為什么學習node.js     node.js可以輔助前端開發,代替后端開發(但其還是不能和java比),node.js與php相比來說,他的優點是:性能高,開發效率高,應用范圍廣,其缺點是:新型語言,函數少,ide(開發環境,編譯器)不完善 什么是node.js?     node.js是基于chrome v8引擎的JavaScript運行環境。node...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    猜你喜歡

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    styled-components —— React 中的 CSS 最佳實踐

    https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡