使用Node編寫輕量級后端快速入門
node 要作為輕量級后端需要下載一些對應模塊可以參考下面命令。你可以借助 npm
(Node Package Manager)來下載它們。
模塊下載
express
:這是一個廣受歡迎的 Node.js Web 應用框架,能用于構建 Web 服務器與 API。
下載命令:
npm install express
cors
:該模塊用于解決跨域資源共享(CORS)問題,允許服務器接受來自不同源的請求。
下載命令:
npm install cors
mysql2/promise
:此模塊為 MySQL 數據庫提供了支持,并且采用了 Promise 風格的 API。
下載命令:
npm install mysql2
multer
:這是一個用于處理multipart/form-data
類型表單數據的中間件,通常用于文件上傳。
下載命令:
npm install multer
fs
:它是 Node.js 的內置模塊,用于文件系統操作,無需額外下載。
你可以在項目根目錄下打開終端,依次執行上述 npm install
命令來下載所需模塊。或者,你也可以一次性安裝所有模塊,使用如下命令:
npm install express cors mysql2 multer
執行完上述命令后,package.json
文件會自動更新,記錄這些依賴項。
作為Web端的必須模塊你必須下載
express
,cors
,multer
快速開始
const express = require('express');
const cors = require('cors');const app = express();
const hostname = '127.0.0.1';
const port = 3000;// 使用 cors 中間件
app.use(cors());// 解析 JSON 格式的請求體
app.use(express.json());// 根路徑接口
app.get('/', (req, res) => {res.send('Hello World');
});// /data 接口
app.get('/data', (req, res) => {const data = { message: 'This is some data' };res.json(data);
});// 404 處理
app.use((req, res) => {res.status(404).send('Not Found');
});// 啟動服務器
app.listen(port, hostname, () => {console.log(`Server running at http://${hostname}:${port}/`);
});
上述代碼即node作為web端的基礎
Node 后端服務各類請求的接收數據處理方式解讀
在 Node.js 后端服務開發中,正確處理各類請求的接收數據至關重要。它直接關系到應用程序的功能完整性、安全性以及性能表現。本文將深入探討 Node.js 中處理不同類型請求數據的常見方式。
一、HTTP 請求方法基礎
在 Web 開發中,常見的 HTTP 請求方法有 GET、POST、PUT、DELETE 等。每種方法都有其特定的用途和數據傳遞方式。
- GET 請求:通常用于從服務器獲取資源。其數據通過 URL 的查詢參數傳遞,例如:http://example.com/api/users?page=1&limit=10。這種方式下,數據暴露在 URL 中,所以不太適合傳遞敏感信息,并且對數據長度有限制。
- POST 請求:主要用于向服務器提交數據,比如用戶注冊、登錄信息等。數據包含在請求體中,不會顯示在 URL 里,適合傳輸較大或敏感的數據。
- PUT 請求:一般用于更新服務器上的資源,將完整的資源數據發送到服務器指定的 URL。
- DELETE 請求:用于刪除服務器上特定 URL 對應的資源。
二、Node.js 中處理請求數據的常用工具和方法
(一)使用原生 http 模塊
Node.js 內置的 http 模塊提供了基本的 HTTP 服務器功能。在處理請求數據時,可以通過req對象來獲取相關信息。
- 處理 GET 請求數據
const http = require('http');
http.createServer((req, res) => {const url = new URL(req.url, 'http://' + req.headers.host);const params = Object.fromEntries(url.searchParams);// 這里的params就是解析后的GET請求參數對象res.writeHead(200, {'Content-Type': 'text/plain'});res.end('GET請求參數:' + JSON.stringify(params));
}).listen(3000, () => {console.log('Server running at port 3000');
});
在這段代碼中,利用URL對象來解析 URL 中的查詢參數,將其轉換為一個對象方便后續處理。
- 處理 POST 請求數據
POST 請求的數據接收稍微復雜一些,因為數據是分塊傳輸的,需要監聽data和end事件。
const http = require('http');
http.createServer((req, res) => {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {// 這里的body就是完整的POST請求體數據res.writeHead(200, {'Content-Type': 'text/plain'});res.end('POST請求體:' + body);});
}).listen(3000, () => {console.log('Server running at port 3000');
});
在實際應用中,還需要根據請求體的格式(如 JSON、URL 編碼等)進一步解析數據。
(二)借助 Express 框架
Express 是 Node.js 中最流行的 Web 應用框架,它簡化了 HTTP 服務器的開發和請求處理過程。
安裝 Express 在項目目錄下運行命令安裝。
npm install express
- 處理 GET 請求參數
const express = require('express');
const app = express();
app.get('/users', (req, res) => {const { page, limit } = req.query;// req.query是Express提供的獲取GET請求查詢參數的對象res.json({ message: '獲取用戶列表', page, limit });
});
app.listen(3000, () => {console.log('Express server running at port 3000');
});
- 處理 POST 請求數據
要處理 POST 請求數據,首先需要使用中間件來解析請求體。對于 JSON 格式的請求體,可以使用express.json()中間件;對于 URL 編碼格式的數據,可以使用express.urlencoded()中間件。
const express = require('express');
const app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post('/login', (req, res) => {const { username, password } = req.body;// req.body包含了解析后的POST請求體數據if (username && password) {res.json({ message: '登錄成功', user: username });} else {res.status(400).json({ message: '用戶名和密碼不能為空' });}
});
app.listen(3000, () => {console.log('Express server running at port 3000');
});
- 處理 PUT 和 DELETE 請求
Express 處理 PUT 和 DELETE 請求的方式與 GET、POST 類似。
app.put('/users/:id', (req, res) => {const { id } = req.params;const { name, age } = req.body;// 根據id更新用戶信息res.json({ message: `更新用戶${id}成功`, user: { id, name, age } });
});
app.delete('/users/:id', (req, res) => {const { id } = req.params;// 根據id刪除用戶信息res.json({ message: `刪除用戶${id}成功` });
});
這里:id是路徑參數,通過req.params獲取。
(三)其他數據格式處理
- 處理表單數據(multipart/form - data)
當需要處理包含文件上傳等復雜表單數據時,常用multer中間件。
首先安裝multer:
npm install multer
const express = require('express');
const multer = require('multer');
const app = express();
const storage = multer.memoryStorage();
const upload = multer({ storage });
app.post('/upload', upload.single('file'), (req, res) => {if (req.file) {res.json({ message: '文件上傳成功', file: req.file });} else {res.status(400).json({ message: '沒有文件上傳' });}
});
app.listen(3000, () => {console.log('Server running at port 3000');
});
在這個例子中,upload.single(‘file’)表示處理名為file的單個文件上傳。
- 處理 XML 數據
如果需要處理 XML 格式的請求數據,可以使用xml2js等庫將 XML 轉換為 JavaScript 對象。
先安裝xml2js:
npm install xml2js
const express = require('express');
const xml2js = require('xml2js');
const app = express();
const parser = new xml2js.Parser();
app.post('/xml', (req, res) => {let xmlData = '';req.on('data', chunk => {xmlData += chunk;});req.on('end', () => {parser.parseString(xmlData, (err, result) => {if (err) {res.status(400).json({ message: 'XML解析錯誤', error: err });} else {res.json({ message: 'XML解析成功', data: result });}});});
});
app.listen(3000, () => {console.log('Server running at port 3000');
});
Node 中如何進行參數接收
在 Node.js 開發中,參數接收是一個基礎且關鍵的環節。無論是處理來自客戶端的請求參數,還是獲取命令行中傳遞的參數,正確且高效地接收參數對于程序的正常運行和功能實現至關重要。接下來,我們將深入探討在 Node.js 中接收不同類型參數的方法。
一、接收命令行參數
Node.js 提供了一個全局對象process
,其中的process.argv
屬性可以獲取到所有命令行參數。該屬性返回一個數組,數組的第一個元素總是node
命令的路徑,第二個元素是正在執行的 JavaScript 文件的路徑,從第三個元素開始才是實際傳遞的命令行參數。
假設我們有一個簡單的需求:接收命令行中的一個或多個參數,并計算它們的和。可以按照以下步驟實現:
創建一個新的 JavaScript 文件,例如sum.js
。
在文件中編寫如下代碼:
// 定義一個變量用于保存求和結果let result = 0;// 遍歷process.argv數組,從索引為2的位置開始(即實際參數的起始位置)for (let i = 2; i < process.argv.length; i++) {// 將參數轉換為數值類型并累加到result中result += Number(process.argv\[i]);}// 打印求和結果console.log(result);
在命令行中運行該程序,并傳遞參數。例如,輸入node sum.js 1 2 3
,控制臺將輸出6
,即傳遞的參數1
、2
和3
的和。
需要注意的是,process.argv
輸出的參數全部是字符串類型。如果需要進行數值運算,必須先將其轉換為合適的數值類型,如使用Number()
函數或+
運算符進行轉換。
另外,在 ES6 中,我們可以利用解構賦值和剩余參數來更方便地處理命令行參數。示例如下:
const [, , ...args] = process.argv;// 這里的args就是所有的命令行參數數組console.log(args);
這樣,args
數組將直接包含所有傳遞的命令行參數,而不需要手動跳過前兩個元素。
二、接收 HTTP 請求參數
在 Node.js 的 Web 開發中,處理 HTTP 請求參數是非常常見的操作。HTTP 請求主要有 GET 和 POST 兩種方式,它們傳遞參數的方式和接收參數的方法也有所不同。
(一)接收 GET 請求參數
使用原生 http 和 url 模塊:Node.js 的內置http
模塊用于創建 HTTP 服務器,url
模塊則可以幫助我們解析 URL 中的參數。以下是一個簡單的示例:
const http = require('http');const url = require('url');http.createServer((req, res) => {// 使用url.parse方法解析URL,并將第二個參數設置為true以獲取查詢參數對象const queryObject = url.parse(req.url, true).query;console.log(queryObject);res.writeHead(200, {'Content-Type': 'text/html'});res.end('參數已接收');}).listen(3000, () => {console.log('Server is running on port 3000');});
在這個示例中,通過url.parse(req.url, true).query
可以獲取到 URL 中的查詢參數,例如當請求 URL 為http://localhost:3000/?name=John&age=30
時,queryObject
將是一個包含name
和age
屬性的對象,即{ name: 'John', age: '30' }
。
使用 Express 框架:Express 是 Node.js 中最流行的 Web 應用框架,它極大地簡化了 HTTP 服務器的開發和請求處理。使用 Express 處理 GET 請求參數更加簡潔:
const express = require('express');const app = express();app.get('/', (req, res) => {const queryParams = req.query;console.log(queryParams);res.send('參數已接收');});app.listen(3000, () => {console.log('Server is running on port 3000');});
在 Express 中,req.query
直接返回一個包含所有查詢參數的對象。例如,當請求 URL 為http://localhost:3000/?product=book&price=20
時,req.query
將是{ product: 'book', price: '20' }
。
(二)接收 POST 請求參數
使用原生 http 模塊:處理 POST 請求參數相對復雜一些,因為數據是包含在請求體中,且可能以流的形式分塊傳輸。需要監聽data
和end
事件來獲取完整的請求體數據,然后根據數據格式進行解析。以下是一個簡單的示例,假設請求體數據為 JSON 格式:
const http = require('http');http.createServer((req, res) => {let body = '';req.on('data', chunk => {body += chunk.toString();});req.on('end', () => {try {const postData = JSON.parse(body);console.log(postData);res.writeHead(200, {'Content-Type': 'text/html'});res.end('POST參數已接收');} catch (error) {res.writeHead(400, {'Content-Type': 'text/html'});res.end('請求體數據解析錯誤');}});}).listen(3000, () => {console.log('Server is running on port 3000');});
在這個示例中,通過監聽req
的data
事件,將接收到的每一塊數據累加到body
變量中。當end
事件觸發時,表示請求體數據接收完畢,此時嘗試將body
解析為 JSON 格式的數據。
使用 Express 框架:在 Express 中處理 POST 請求參數,通常需要借助中間件來解析請求體。對于 JSON 格式的請求體,可以使用express.json()
中間件;對于 URL 編碼格式的數據,可以使用express.urlencoded()
中間件。示例如下:
const express = require('express');const app = express();// 使用express.json()中間件解析JSON格式的請求體app.use(express.json());// 使用express.urlencoded()中間件解析URL編碼格式的請求體app.use(express.urlencoded({ extended: true }));app.post('/login', (req, res) => {const { username, password } = req.body;if (username && password) {res.json({ message: '登錄成功', user: username });} else {res.status(400).json({ message: '用戶名和密碼不能為空' });}});app.listen(3000, () => {console.log('Server is running on port 3000');});
在這個示例中,express.json()
和express.urlencoded()
中間件會將請求體數據解析后掛載到req.body
上,我們可以直接從req.body
中獲取相應的參數。例如,當發送一個包含username
和password
的 JSON 格式的 POST 請求時,req.body
將包含這些參數,我們可以通過req.body.username
和req.body.password
來獲取它們的值。
三、其他參數接收場景
(一)處理表單數據(multipart/form - data)
當涉及文件上傳等復雜表單數據時,需要使用專門的中間件來處理。multer
是一個常用的處理multipart/form - data
類型表單數據的中間件。
首先,需要安裝multer
:npm install multer
。
以下是一個簡單的文件上傳示例:
const express = require('express');const multer = require('multer');const app = express();const storage = multer.memoryStorage();const upload = multer({ storage });app.post('/upload', upload.single('file'), (req, res) => {if (req.file) {res.json({ message: '文件上傳成功', file: req.file });} else {res.status(400).json({ message: '沒有文件上傳' });}});app.listen(3000, () => {console.log('Server is running on port 3000');});
在這個示例中,upload.single('file')
表示處理名為file
的單個文件上傳。當文件上傳成功時,req.file
將包含上傳文件的相關信息,如文件名、文件類型、文件內容等。
(二)處理 XML 數據
如果需要處理 XML 格式的請求數據,可以使用xml2js
等庫將 XML 轉換為 JavaScript 對象。
先安裝xml2js
:npm install xml2js
。
示例代碼如下:
const express = require('express');const xml2js = require('xml2js');const app = express();const parser = new xml2js.Parser();app.post('/xml', (req, res) => {let xmlData = '';req.on('data', chunk => {xmlData += chunk;});req.on('end', () => {parser.parseString(xmlData, (err, result) => {if (err) {res.status(400).json({ message: 'XML解析錯誤', error: err });} else {res.json({ message: 'XML解析成功', data: result });}});});});app.listen(3000, () => {console.log('Server is running on port 3000');});
在這個示例中,通過監聽req
的data
事件獲取 XML 數據,當end
事件觸發時,使用xml2js
的Parser
將 XML 數據解析為 JavaScript 對象,并根據解析結果返回相應的響應。