日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

ndoe中express框架的基本使用,接收get、post請求,以及處理回調地獄的優雅解決方法

作者:jieyucx 更新時間: 2023-07-26 編程語言

一、express框架的基本使用

Express框架是Node.js中最受歡迎的web開發框架,它的設計簡潔而且功能強大,有著大量的插件和社區支持。

基于Express使用Node.js創建web應用的基本步驟如下:

  1. 首先你需要安裝Node.js和npm(Node包管理器),然后在你的項目文件夾中安裝Express:
npm install express --save
  1. 然后在項目中創建一個JavaScript文件,比如app.js,并且在文件中導入Express:
var express = require('express');
var app = express();
  1. 使用app對象的get方法,對某個URL路徑進行路由處理:
app.get('/', function (req, res) {
    res.send('Hello World!');
});

這個代碼表示當客戶端向服務器發起一個HTTP GET請求,請求的URL路徑為“/”時,服務器會響應一個“Hello World!”的消息。

  1. 使用app對象的listen方法,讓服務器開始監聽某個端口:
app.listen(3000, function () {
    console.log('Example app listening on port 3000!');
});

這個代碼表示服務器會在3000端口監聽請求。

  1. 運行這個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.isArrayinstanceof 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

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新