NodeJs簡明教程(3)

NodeJs簡明教程將從零開始學習NodeJs相關知識,助力JS開發者構建全棧開發技術棧!

本文是NodeJs簡明教程的第三篇,將介紹NodeJs自帶HTTP模塊服務器相關的基本操做。html

HTTP模塊介紹

如下是官方原文[1]:node

The HTTP interfaces in Node.js are designed to support many features of the protocol which have been traditionally difficult to use. In particular, large, possibly chunk-encoded, messages. The interface is careful to never buffer entire requests or responses — the user is able to stream data.

大體意思就是:web

NodeJs的HTTP模塊旨在支持傳統上HTTP協議難以使用的許多功能,讓這些功能或者特性可以使用簡單的API進行調用。

HTTP模塊服務器開發

代碼示例

如下是NodeJs最簡單的HTTP服務器示例:json

  1. 新建index.js
  2. 編碼瀏覽器

    const http = require('http');
    
    const server = http.createServer((req, res) => {
        console.log('%s %s', req.method, req.url)
        res.end(JSON.stringify(req.headers))
    })
    
    server.listen(8080, () => console.log('listen on 8080'))
  3. 打開終端或者控制檯,執行 node index.js,終端或控制檯會輸出listen on 8080,此時HTTP服務器已經啓動,若是啓動失敗,能夠在下方留言
  4. 打開瀏覽器訪問 http://localhost:8080,筆者輸出以下:服務器

    {
        "host": "localhost:8080",
        "connection": "keep-alive",
        "cache-control": "max-age=0",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36",
        "dnt": "1",
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
        "accept-encoding": "gzip, deflate, br",
        "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7",
    }

代碼說明

  1. NodeJs採用 CMD模塊系統require 用來加載模塊,本例中加載了NodeJs自帶的http模塊以使用其中的功能
  2. http.createServer函數建立了一個 HTTP服務器,並配置了請求回調函數,在本系列的第一篇文章中說到事件驅動是須要回調函數進行監聽的。
  3. server.listen是監聽系統端口,第二個參數是監聽成功的回調函數

req對象

服務器收到的HTTP請求對象,如下是經常使用的屬性或方法:app

  1. req.url 本次請求的路徑(不包含域名)
  2. req.headers 本次請求的請求頭
  3. req.httpVersion 本次請求的HTTP協議版本號
  4. req.method 本次請求的請求方法,有GET/POST/PUT等等
  5. on() 監聽請求體數據 POST/PUT/PATCH方法會有請求體

res對象

res對象是req請求對象相應的響應對象,HTTP協議設計是請求-應答模型,一次請求對應一次應答。框架

如下是經常使用的屬性或方法:函數

  1. res.writeHead 輸出響應狀態碼狀態碼說明以及多個HTTP響應頭
  2. res.end 輸出數據並結束本次響應
  3. res.write 輸出部份內容(chunk)
  4. res.setHeader 輸出單個響應頭

請求路由

NodeJs自帶的HTTP服務器是沒有路由功能的,也是就說,根據請求的URI來執行不一樣的邏輯須要開發者手動去作post

const http = require('http');

const server = http.createServer((req, res) => {
    if (req.url === '/') {
        res.end('index');
        return;
    }
    if (req.url === '/user') {
        res.end('user');
        return;
    }
})

server.listen(8080, () => console.log('listen on 8080'));
  1. 執行node index.js
  2. 瀏覽器訪問 http://localhost:8080/ 會輸出index
  3. 瀏覽器訪問 http://localhost:8080/user 會輸出user

讀取請求參數

讀取GET請求參數

const http = require('http');
const url = require('url');
const qs = require('querystring');

const server = http.createServer((req, res) => {
    const parsed = url.parse(req.url);
    const query = qs.parse(parsed.query);
    res.end(JSON.stringify(query));
})

server.listen(8080, () => console.log('listen on 8080'));
  1. 執行node index.js
  2. 瀏覽器訪問 [http://localhost:8080/?a=x&b=2&c[]=1&c[]=2](http://localhost:8080/?a=x&b=2&c[]=1&c[]=2)
  3. 顯示

    {
        "a": "x",
        "b": "2",
        "c[]": ["1", "2"]
    }

讀取請求體參數

HTTP協議規範中POST/PUT/PATCH均可以攜帶請求體,NodeJs HTTP服務器接收請求體代碼以下:

const http = require('http');
const url = require('url');
const qs = require('querystring');

const server = http.createServer((req, res) => {
    let data = Buffer.alloc(0);
    req.on('data', (buffer) => {
        data = Buffer.concat([data, buffer]);
    })
    req.on('end', () => {
        res.end(data.toString())
    })
})

server.listen(8080, () => console.log('listen on 8080'));
  1. 執行node index.js
  2. 使用 postman 發出POST請求http://localhost:8080,本例POST請求體爲 a=1&b=2
  3. postman會返回 a=1&b=2

結語

一個簡單的HTTP服務器就到此結束了,固然,實際生產中該方法用的比較少,幾乎都是使用框架進行開發,提升開發效率。

歡迎關注Nodejs之路公衆號得到持續更新以及在線答疑幫助。
二維碼

相關文章
相關標籤/搜索