http模塊
搭建服務器的步驟
① 導入 http 模塊
② 創建 web 服務器實例
③ 為服務器實例綁定 request 事件,監聽客戶端的請求
④ 啟動服務器
// ① 導入 http 模塊
const http = require('http');// ② 創建 web 服務器實例
const server = http.createServer();// ③ 為服務器實例綁定 request 事件,監聽客戶端的請求
// server.on('事件名稱', 處理函數);// 只要客戶端發來請求,則會觸發下面的事件
server.on('request', function () {console.log('你的請求我收到了');
});// ④ 啟動服務器
server.listen(3000, function () {// 服務器啟動之后,會觸發這個回調函數console.log('my first web server start~');
});
測試:
- node執行你的JS代碼
- 打開客戶端(瀏覽器、postman),向服務器發送請求(localhost:3000)
- 查看,代碼中的請求事件,是否觸發了,如果觸發了,表示請求成功了
使用http搭建服務器的問題
-
代碼如果更改了,則需要重新啟動服務器,你的代碼才會生效
- Ctrl + C , 先終止服務
- 再次執行 node xxx.js 重新啟動服務即可
-
vscode 終端的使用問題
URL的組成
http://www.xxxx.com:3000/yyy/zzz?id=123
- 協議
- http
- https
- 主機地址(找到服務器)
- 指向服務器的域名,(localhost 永遠指向自己的計算機)
- 服務器的IP地址 (127.0.0.1 永遠指向自己的計算機)
- 端口
- 作用是區分服務器上的每個服務的
- 可以通過
netstat -an
查看已經被占用的端口
- 文件路徑部分(/api/getbooks index.html /a/b/c/xxx.html)
- 查詢字符串部分(GET請求的參數)
獲取請求相關的信息
server.on('request', function (req) {// req 對象,是根據 http.IncomingMessage類得來的對象// 通過這個對象,我們可以得到請求的相關信息req.url // 表示請求的urlreq.method // 表示請求方式req.headers // 表示請求頭
})
得到請求相關的信息之后,方便服務器做出判斷
服務器做出響應
server.on('request', function (req, res) {// 所有和請求相關的信息,都是通過req對象獲取的// 所有和響應相關的信息,都通過res來完成。res這里是response的意思。// console.log(res instanceof http.ServerResponse); // true// res.end(); // 用于做出響應// res.setHeader(name, value); // 設置響應頭// res.statusCode // 設置響應狀態碼// res.writeHead(狀態碼, {響應頭})// 告訴瀏覽器,響應的數據是什么類型、什么編碼// res.setHeader('Content-Type', 'text/html; charset=utf-8');// res.statusCode = 404; // 隨便設置的狀態碼,實際中應該是200res.writeHead(200, {// key: value'Content-Type': 'text/html; charset=utf-8','Author': 'LaoTang', // 隨便寫的,實驗一下。值不能用中文});res.end('你好瀏覽器,你的請求我收到了,這是給你的回應');
})
GET方式的接口
-
提供數據給客戶端(終極目標)
-
具體的獲取書籍的接口
- 讀取books.json里面的內容
- fs.readFile() — 讀取的結果是json格式
- require() — 讀取的結果是array格式
- 把讀取的結果響應給客戶端 — 響應的結果,必須是json字符串格式
- 遇到的問題
- 解決跨域的問題 – 設置響應頭
- 解決編碼的問題 – 設置響應頭
- 讀取books.json里面的內容
POST方式的接口
- 接收并保存數據(終極目標)
- 如何接收POST請求體
- 定義空字符串,比如str
- 注冊req的data事件,用于接收客戶端提交的數據
- 注冊req的end事件,當完全接收到了客戶端提交的數據,會觸發這個事件
- 保存數據
- 做出響應
// 加載所需的模塊
const fs = require('fs');
const path = require('path');
const querystring = require('querystring');
// 搭建服務器
const http = require('http');
const server = http.createServer();
server.listen(3006, () => console.log('圖書管理案例接口服務啟動了'));server.on('request', (req, res) => {// 客戶端都會發送什么類型的請求,請求的url又是什么let method = req.method; // 獲取請求方式let url = req.url; // 獲取請求的url// 定義書籍 books.json的絕對路徑let filename = path.join(__dirname, 'books.json');// 判斷,請求的是否是獲取圖書的接口if (method === 'GET' && url === '/api/getbooks') {// 說明客戶端請求的就是獲取書籍的接口// 把所有書籍信息響應給客戶端// 讀取books.json里面的內容,把讀取的結果響應給客戶端// 讀取json文件,可以直接使用 require let data = require(filename);// console.log(data); // 得到一個數組res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解決跨域問題'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 200,msg: '獲取圖書成功',data: data}));} else if (method === 'POST' && url === '/api/addbook') {// 說明請求的是添加圖書的接口// console.log(111);// 1. 接收客戶端提交的數據// 1.1 定義一個空字符串,一會要把接收到的數據拼接到空字符串中let str = '';// 1.2 注冊req的data事件,用于接收客戶端提交的數據// 當接收到客戶端的提交的數據的時候,就會觸發這個事件,形參chunk就是接收到一部分數據req.on('data', (chunk) => {str += chunk;});// 1.3 注冊req的end事件,當完全接收到了客戶端的數據之后,會觸發req.on('end', () => {// console.log(str); // 完整的數據 // bookname=aaa&author=bbb&publisher=ccc// 2. 保存到 books.json中let old = require(filename); // 得到數組let newBook = querystring.parse(str);newBook.id = Date.now(); // 臨時使用時間戳當做idold.push(newBook);fs.writeFile(filename, JSON.stringify(old), (err) => {if (err) return console.log(err);// 沒有錯誤,保存成功// 3. 做出響應res.writeHead(200, {'Access-Control-Allow-Origin': '*', // 解決跨域問題'Content-Type': 'application/json; charset=utf-8'});res.end(JSON.stringify({status: 201,msg: '添加圖書成功',}));});});} else {res.end('錯誤');// 說明客戶端代碼寫錯了。客戶端請求了一個不存在的資源}
});
npm初步使用
介紹
npm(node package manager)node包管理器。
包是什么?包就是模塊。
npm這個工具,在安裝node的時候,就已經安裝到你的計算機中了。
命令行中執行: npm -v
,如果看到版本號,說明安裝成功了。
作用
npm的作用是:管理node模塊的工具。
- 下載并安裝第三方的模塊
- 卸載第三方模塊
- 發布模塊
- 刪除已發布的模塊
- …
第三方模塊:
- 非內置模塊,安裝完node,還不能使用的模塊,需要從網上下載安裝,才能使用的模塊
- 第三方模塊是個人、公司、組織編寫的模塊,發布到網上,供我們使用
npm 就是一個管理(下載安裝、卸載…)第三方模塊的工具
初始化
使用npm工具之前,必須先初始化。
npm init -y
# 或
npm init
# 然后一路回車
初始化之后,會在項目目錄中生成 package.json 的文件。
什么第三方模塊
非node自帶的模塊。
是別人寫的模塊,然后發布到npm網站,我們可以使用npm工具來下載安裝別人寫的模塊。
第三方模塊,都是在node核心模塊的基礎之上,封裝了一下,實現了很多非常方便快速簡潔的方法。
目前,npm網站收錄了超過 150萬個第三方模塊。
安裝卸載項目模塊
下載安裝第三方模塊
npm install 模塊名
npm i 模塊名
卸載模塊
npm uninstall 模塊名
npm un 模塊名
關于項目模塊的說明
- 下載安裝的模塊,存放在當前文件夾的
node_modules
文件夾中,同時還會生成一個記錄下載的文件package-lock.json
- 下載的模塊,在哪里可以使用
- 在當前文件夾
- 在當前文件夾的子文件夾
- 在當前文件夾的子文件夾的子文件夾
- …
- 怎樣使用第三方模塊
- 和使用內置模塊一樣,需要使用
require
加載模塊 - 調用模塊提供的方法完成工作(一般好的模塊都會用使用文檔的)
- 和使用內置模塊一樣,需要使用
演示下載安裝第三方模塊:moment
這里演示一個處理時間日期的模塊 – moment
下載安裝moment模塊
npm init -y
npm i moment
演示使用moment模塊處理時間
// 加載模塊
const moment = require('moment');console.log(moment().format('YYYY-MM-DD hh:mm:ss'));
// 官網:http://momentjs.cn
全局模塊
-
全局安裝的模塊,不能通過
require()
加載使用。 -
全局安裝的模塊,一般都是命令或者工具。
-
安裝方法,在安裝模塊的命令后面,加
-g
npm i 模塊名 -g # 或 npm i -g 模塊名
-
卸載方法(也是多一個
-g
)npm un 模塊名 -g
-
全局安裝的模塊,在系統盤(C盤)
- 通過命令
npm root -g
可以查看全局安裝路徑
- 通過命令
mac安裝過程可能出現權限問題,可以使用 sudo npm i xxx -g
全局安裝nodemon模塊
-
安裝命令
npm i nodemon -g
-
nodemon的作用:
-
代替node命令,啟動服務的,當更改代碼之后,nodemon會自動幫我們重啟服務。
-
運行nodemon,如果報錯如下:
-
解決辦法是:
管理員
方式,打開命令行窗口- 執行
set-ExecutionPolicy RemoteSigned;
- 在出現的選項中,輸入
A
,回車。即可
更改鏡像源
鏡像源,就是下載安裝第三方模塊的網站。
我們下載的第三方模塊都是從國外的npm主站下載的,速度比較慢。
淘寶在國內對npm上的第三方模塊做了一個備份,也就是說,我們可以從國內下載第三方模塊。
除了淘寶之外,還有很多其他鏡像源。
簡單的更改鏡像源方法:
- 全局安裝 nrm 的模塊
npm i nrm -g
- nrm 用于管理鏡像源
- 使用nrm
nrm ls
通過這個命令,可以查看可用的鏡像源nrm use taobao
,切換下載模塊的網站為淘寶
注意 :如果 nrm 安裝失敗,請修改電腦的環境變量,給環境變量添加上 npm 的絕對地址,再次查詢即可
查詢版本
nrm - y
使用已下nmp 代碼可以根據 package.json重新安裝node_modules中的模塊信息
npm i
如果安裝出現錯誤:
1. 查看 npm 版本
2. 鏡像源的配置