網站首頁 編程語言 正文
一、express框架的基本使用
Express框架是Node.js中最受歡迎的web開發框架,它的設計簡潔而且功能強大,有著大量的插件和社區支持。
基于Express使用Node.js創建web應用的基本步驟如下:
- 首先你需要安裝Node.js和npm(Node包管理器),然后在你的項目文件夾中安裝Express:
npm install express --save
- 然后在項目中創建一個JavaScript文件,比如app.js,并且在文件中導入Express:
var express = require('express');
var app = express();
- 使用app對象的get方法,對某個URL路徑進行路由處理:
app.get('/', function (req, res) {
res.send('Hello World!');
});
這個代碼表示當客戶端向服務器發起一個HTTP GET請求,請求的URL路徑為“/”時,服務器會響應一個“Hello World!”的消息。
- 使用app對象的listen方法,讓服務器開始監聽某個端口:
app.listen(3000, function () {
console.log('Example app listening on port 3000!');
});
這個代碼表示服務器會在3000端口監聽請求。
- 運行這個Node.js應用:
node app.js
然后你可以打開瀏覽器或者用postman等工具訪問 http://localhost:3000,就會看到顯示的“Hello World!”消息。
完整代碼如下:
// 引入express
var express = require('express');
// 創建express實例
var app = express();
app.get('/', function (req, res) {
res.send('Hello World!');
});
// 監聽3000端口
app.listen(3000, function () {
console.log('app is listening at port 3000');
console.log('http://localhost:3000');
});
Express還有很多高級特性,比如可以方便地解析請求參數、處理POST請求、使用模板引擎生成動態HTML頁面、使用中間件進行統一處理等等。
二、解析get/post請求
1. 接收get請求參數
如果我們要接收GET請求的參數,我們可以通過req.query
對象來獲取。比如有一個GET請求參數是http://localhost:3000/?name=John
,我們就可以通過以下方式獲取到參數name的值:
app.get('/', (req, res) => {
let name = req.query.name;
res.send(`Hello ${name}`);
});
在這里,當用戶訪問http://localhost:3000/?name=John
時,應用將會返回字符串"Hello John"。
2. 接收post請求參數
在node.js中,我們通常使用Express框架來處理HTTP請求。對于POST請求,Express提供了專門的API。下面是一個基本示例:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json()); // 在請求處理之前,先解析JSON
app.post('/example', (req, res) => {
console.log(req.body); // 打印輸出請求的JSON數據
res.send('Post request received');
});
app.listen(3000, () => console.log('Server started on port 3000'));
以上代碼創建了一個Express服務器,并監聽3000端口,然后使用body-parser
中間件來解析JSON格式的POST請求。bodyParser.json()
返回的是一個用于處理HTTP請求的函數,每當有新的請求過來,這個函數就會被調用,它會讀取請求體中的JSON數據,然后放到req.body
中。
當/example
路徑接收到POST請求時,Express會執行對應的回調函數,打印出解析后的JSON數據,然后將Post request received
返回給客戶端。
如果你想接收不同格式的POST請求參數,比如從表單提交的數據,你需要使用不同的body-parser
解析器。例如,可以使用bodyParser.urlencoded()
解析"application/x-www-form-urlencoded" 格式的數據:
app.use(bodyParser.urlencoded({ extended: true }));
extended
選項設置為true
意味著用更復雜的庫(querystring庫)來解析URL編碼的數據,這樣可以解析更復雜的對象、嵌套對象等等。
如果POST請求發送的是純文本或其他格式,可以使用bodyParser.text()
或bodyParser.raw()
來處理。
總的來說,body-parser
中間件提供了一系列方法來解析不同格式的POST請求數據,根據你的需要選擇使用即可。
請注意,Express 4.16.0增加了一些內置的中間件,所以對于基本的json和urlencoded解析,你可以不用body-parser
。
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
例如:
// 引入express
const express = require('express');
// 創建express實例
const app = express();
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.get('/', (req, res) => {
let name = req.query.name;
res.send(`Hello ${name}`);
});
app.post('/', (req, res) => {
let user = req.body;
res.send(user);
});
// 監聽3000端口
app.listen(3000, function () {
console.log('app is listening at port 3000');
console.log('http://localhost:3000');
});
-
application/x-www-form-urlencoded
-
application/json
三、處理回調地獄問題
1. 內置模塊util介紹
util
是Node.js的核心模塊之一,在Node中,可通過 require('util')
命令將其引入。
util
模塊主要用于支持Node.js核心API的需要,盡管一些實用函數可供應用程序和其它模塊使用。以下是util
模塊中一些常用的函數:
-
util.debuglog
: 創建一個函數,基于NODE_DEBUG環境變量,用于創建一個條件性的調試器。 -
util.deprecate
: 將一個函數包裝成廢棄函數。 -
util.format
: 返回一個格式化的字符串。 -
util.inherits
: 實現對象間原型繼承的函數。 -
util.inspect
: 將任意對象轉換為字符串,通常用于調試和錯誤輸出。 -
util.isArray
:如果給定的參數 “object” 是一個數組返回true,否則返回false。 -
util.isDate
: 如果給定的參數 “object” 是一個日期返回true,否則返回false。 -
util.isError
: 如果給定的參數 “object” 是一個錯誤對象返回true,否則返回false。 -
util.isRegExp
: 如果給定的參數 “object” 是一個正則表達式返回true,否則返回false。
注意,在Node.js v10.0.0中,一些函數(例如 util.isError
, util.isDate
等)已經被廢棄,建議使用更標準的JavaScript內置API,如 Array.isArray
,instanceof Date
等來替換。
2. promisify的使用
util.promisify
是 Node.js 的內置模塊中的一個方法,它主要把一個遵循通用錯誤優先的回調風格的函數(即最后一個參數是一個 (err, value) => ...
回調)轉換成一個返回 promise 的函數。
示例如下:
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);
readFile('/some/file')
.then(data => {
console.log(data);
})
.catch(err => {
console.log(err);
});
在這個示例中,fs.readFile
是一個典型的 Node.js 回調風格的函數,它的最后一個參數為回調函數,回調函數的第一個參數為可能出現的錯誤,第二個參數為函數的返回值。
通過 util.promisify
,我們將它轉換成了一個返回 promise 的函數。這樣,我們就可以使用 .then
和 .catch
來處理函數的返回值和可能出現的錯誤,而不需要通過回調函數的方式。這通常可以讓代碼更加簡潔,邏輯更清晰。
實際應用場景
在實際編程中,比如你正在使用一款第三方庫,而這個第三方庫的 API 是 callback 風格的。你想在 async/await 的語境下使用這個 API。那么,util.promisify 就可以幫助你將這個 API 轉換成 Promise 風格,從而可以在 async/await 中使用。
例如:
const util = require('util');
const request = require('request');
const requestPromise = util.promisify(request);
async function main() {
const { body } = await requestPromise('https://example.com');
console.log(body); // 請求返回的 HTML
}
main();
在這個例子中,request
函數源自一個 HTTP 請求庫,該函數符合錯誤優先回調風格。通過 util.promisify
,我們將 request
函數轉換成返回 promise 的函數,然后在 async/await 的上下文中使用它。這使我們能以同步的方式編寫異步代碼,使處理異步代碼變得更簡單。
四、HTTP響應狀態碼介紹
HTTP響應狀態碼,或HTTP狀態碼,是服務器在響應HTTP請求時返回的一個3位數字代碼,用于表示服務器處理請求的結果。這些代碼被分類為五種類別,以它們的首位數字表示,例如1xx,2xx,3xx,4xx和5xx。
1. 1xx(信息響應)
指示請求已收到,繼續處理。
例如:
- 100(繼續):客戶端應繼續其請求
- 101(切換協議):根據客戶端的要求,服務器會切換協議。
2. 2xx(成功)
表明請求已被成功接收,理解,和接受。
例如:
- 200(成功):請求成功
- 201(已創建):請求成功并且服務器創建了新的資源
- 202(已接受):服務器已接受請求,但尚未處理
3. 3xx(重定向)
需要客戶端采取進一步的操作才能完成請求。
例如:
- 300(多種選擇):針對資源有多個配置可用,需要用戶選擇其中一個。
- 301(永久移動):請求的網頁已永久移動到新位置
- 302(臨時移動):服務器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以后的請求。
4. 4xx(請求錯誤)
表示請求包含語法錯誤或無法完成請求。
例如:
- 400(錯誤請求):服務器無法理解請求的格式
- 401(未授權):用戶需要身份驗證
- 403(禁止):服務器理解請求客戶端的請求,但是拒絕執行它。
- 404(未找到):服務器找不到請求的網頁。
5. 5xx(服務器錯誤)
表示服務器在嘗試處理請求時發生內部錯誤。
例如:
- 500(服務器內部錯誤):服務器遇到錯誤,無法完成請求
- 502(錯誤網關):服務器作為網關或代理,從上游服務器收到無效響應。
- 503(服務不可用):服務器目前無法使用(由于超載或停機維護)。通常,這只是暫時狀態。
- 504(網關超時):服務器作為網關或代理,但是沒有及時從上游服務器收到請求。
表格形式
狀態碼 | 含義 | 描述 |
---|---|---|
100 | 繼續 | 客戶端應當繼續發送請求。 |
101 | 切換協議 | 服務器根據客戶端的請求切換協議。 |
200 | OK | 請求成功。一般用于GET與POST請求。 |
201 | 已創建 | 請求成功并且服務器創建了新的資源。 |
202 | 接受 | 已接受請求,但未處理完成。 |
203 | 非授權信息 | 請求成功,但返回的元信息不在原始服務器上,而是從一個副本返回的。 |
204 | 無內容 | 服務器成功處理,但未返回內容。 |
205 | 重置內容 | 服務器處理成功,用戶終端(例如:瀏覽器)應重置文檔視圖。 |
206 | 部分內容 | 服務器成功處理了部分GET請求。 |
300 | 多種選擇 | 請求的資源可包含多個位置,可用于自動選擇服務器。 |
301 | 永久移動 | 請求的資源被永久的移動到新URI,返回信息會包括新的URI。 |
302 | 臨時移動 | 與301類似,但資源只是臨時被移動。 |
303 | 查看其他位置 | 請求對應的資源存在著另一個URI,應使用GET方法獲取該資源。 |
304 | 未修改 | 資源未改變。 |
305 | 使用代理 | 被請求的資源必須通過指定的代理獲取。 |
306 | 已經廢棄 | 在以前版本的HTTP中使用。 |
307 | 臨時重定向 | 與302類似,但對于POST請求,會跳轉到新的URI并使用GET方法。 |
400 | 錯誤請求 | 請求中有語法問題,或不能滿足請求。 |
401 | 未授權 | 需要證明身份。 |
402 | 需要付款 | 預留的響應,目前未被使用。 |
403 | 被禁止訪問 | 服務器拒絕請求。 |
404 | 找不到 | 無法找到所請求的資源。 |
405 | 不允許的方法 | 請求中的方法被禁止。 |
406 | 不可接受 | 服務器只能生成客戶端不接受的響應。 |
407 | 需要代理驗證 | 客戶端必須通過代理授權。 |
408 | 請求超時 | 服務器等待請求超時。 |
409 | 沖突 | 服務器在滿足請求時發現沖突。 |
410 | 過期 | 請求的資源已經不存在。 |
411 | 需要長度 | 服務器無法處理不包含Content-Length的請求信息。 |
412 | 未滿足前提條件 | 服務器未滿足客戶端在請求中設置的其中一個前提條件。 |
413 | 請求實體過大 | 請求的實體過大,服務器無法處理。 |
414 | 請求URI過長 | 請求URI過長,服務器無法處理。 |
415 | 不支持媒體類型 | 請求的格式不受請求頁面的支持。 |
416 | 請求范圍不滿足 | 請求中包含的Range頭字段不能與響應中的實體兼容。 |
417 | 未滿足期望 | 服務器不能滿足Expect頭字段指定的預期。 |
500 | 服務器內部錯誤 | 服務器遇到了一個未曾預料的狀況,導致不能完成客戶端請求。 |
501 | 未實現 | 服務器不支持當前請求所需要的某個功能。 |
502 | 錯誤網關 | 當作為一個代理或者網關時,處理其他服務器的響應失敗。 |
503 | 服務器目前無法使用 | 由于過載或者維護,服務器暫時無法處理請求。 |
504 | 網關超時 | 作為一個網關或者代理工作的服務器嘗試執行請求時,未能及時從上游服務器收到響應。 |
505 | HTTP版本不支持 | 服務器不支持,或者拒絕支持在請求中使用的 HTTP 版本。 |
以上,就是HTTP響應狀態碼的基本信息。在軟件開發過程中,了解并正確使用這些狀態碼,有助于增強應用程序的健壯性和可靠性。
原文鏈接:https://blog.csdn.net/jieyucx/article/details/131621123
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-29 Qt?Design?Studio創建工程的實現方法_C 語言
- 2022-12-07 C++?Boost?Array與Unordered使用介紹_C 語言
- 2022-10-31 Python+Selenium實現網站滑塊拖動操作_python
- 2022-05-23 Nginx工作模式及代理配置的使用細節_nginx
- 2022-11-25 Go實現快速生成固定長度的隨機字符串_Golang
- 2022-01-11 <meta name=“description“ content=““ />代碼中加入這行代碼的作用
- 2022-05-26 基于Flutter實現風車加載組件的制作_Android
- 2022-12-07 C++?Boost?Container庫示例詳細講解_C 語言
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支