1、引入
傳統的Web服務器有IIS、apache、ningx等,現在,使用 Nodejs 也可以非常輕松的構建一個 Web 服務器了
在 Node 中專門提供了一個核心模塊:http,http 這個模塊提供了創建web服務器的API
2、創建一個能響應客戶端請求的服務器
服務器的作用就是提供對數據的服務
a.客戶端發送請求
b.服務器端接收請求
c.服務器端處理請求,給個反饋(發送響應)
新建文件http.js
// http.js
//1. 加載 http 核心模塊 var http = require('http') // 2. 使用 http.createServer() 方法創建一個 Web 服務器 // 返回一個 Server 實例 var server = http.createServer() // 注冊 request 請求事件 // 當客戶端請求過來,就會自動觸發服務器的 request 請求事件,然后執行第二個參數:回調處理函數 // request 請求事件處理函數,需要接收兩個參數: // Request 請求對象 // 請求對象可以用來獲取客戶端的一些請求信息,例如請求路徑 // Response 響應對象 // 響應對象可以用來給客戶端發送響應消息 server.on('request', function (request, response) { // http://127.0.0.1:3000/ / // http://127.0.0.1:3000/a /a // http://127.0.0.1:3000/foo/b /foo/b console.log('收到客戶端的請求了,請求路徑是:' + request.url) // response 對象有一個方法:write 可以用來給客戶端發送響應數據 // write 可以使用多次,但是最后一定要使用 end 來結束響應,否則客戶端會一直等待 response.write('hello') response.write(' nodejs') // 告訴客戶端,我的話說完了,你可以呈遞給用戶了 response.end() }) server.listen(3000, function () { console.log('服務器啟動成功了,可以通過 http://127.0.0.1:3000/ 來進行訪問') })
打開命令行運行http.js文件
node http.js
瀏覽器訪問http://127.0.0.1:3000/
服務器接收到響應,第二個請求是瀏覽器會默認發送一個獲取站點圖標的請求
3、進階:根據不同的請求路徑發送不同的響應結果
上面的服務器的能力還非常的弱,無論是什么請求,都只能響應 hello nodejs
思考:希望當請求不同的路徑的時候響應不同的結果
例如:
/ index 首頁
/login 登陸
/register 注冊
var http = require('http') var server = http.createServer() // 2. 監聽 request 請求事件,設置請求處理函數 server.on('request', function (req, res) { console.log('收到請求了,請求路徑是:' + req.url) console.log('請求我的客戶端的地址是:', req.socket.remoteAddress, req.socket.remotePort) // 根據不同的請求路徑發送不同的響應結果 // 1. 獲取請求路徑 // req.url 獲取到的是端口號之后的那一部分路徑 // 也就是說所有的 url 都是以 / 開頭的 // 2. 判斷路徑處理響應 var url = req.url if (url === '/') { // 響應內容只能是二進制數據或者字符串 // 數字 // 對象 // 數組 // 布爾值 // 直接 end 的同時發送響應數據 res.end('index page') } else if (url === '/login') { res.end('login page') } else if (url === '/register') { res.end('register page') } else { res.end('404 Not Found.') } }) // 3. 綁定端口號,啟動服務 server.listen(3000, function () { console.log('服務器啟動成功,可以訪問了。。。') })

4、設置響應內容類型
4.1、在上面的例子中響應的都是字符串,那能不能響應一個html頁面或者一張圖片呢?
如果僅僅將響應字符串替換成html代碼,瀏覽器並不會將html代碼解析成想要的頁面
4.2、在服務端默認發送的數據,其實是 utf8 編碼的內容,但是瀏覽器不知道你是 utf8 編碼的內容,瀏覽器在不知道服務器響應內容的編碼的情況下會按照當前操作系統的默認編碼去解析,中文操作系統默認是 gbk,所以如果響應內容是中文的話還會出現亂碼問題
為了解決這兩個問題,需要設置Content-Type響應頭
var http = require('http') var fs = require('fs') var server = http.createServer() server.on('request', function (req, res) { var url = req.url if (url === '/plain') { // text/plain 就是普通文本 res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('hello 世界') } else if (url === '/html') { // 如果你發送的是 html 格式的字符串,則也要告訴瀏覽器我給你發送是 text/html 格式的內容 res.setHeader('Content-Type', 'text/html; charset=utf-8') res.end('<p>hello html <a href="https://www.baidu.com">百度一下</a></p>') } else if (url === '/image/xiaoming') { // url:統一資源定位符 // 一個 url 最終其實是要對應到一個資源的 fs.readFile('./resource/ab2.jpg', function (err, data) { if (err) { res.setHeader('Content-Type', 'text/plain; charset=utf-8') res.end('文件讀取失敗,請稍后重試!') } else { // data 默認是二進制數據,可以通過 .toString 轉為咱們能識別的字符串 // res.end() 支持兩種數據類型,一種是二進制,一種是字符串 // 圖片就不需要指定編碼了,因為我們常說的編碼一般指的是:字符編碼 res.setHeader('Content-Type', 'image/jpeg') res.end(data) } }) } }) server.listen(3000, function () { console.log('Server is running...') })