使用Node編寫輕量級后端快速入門

使用Node編寫輕量級后端快速入門

node

node 要作為輕量級后端需要下載一些對應模塊可以參考下面命令。你可以借助 npm(Node Package Manager)來下載它們。

模塊下載

  1. express:這是一個廣受歡迎的 Node.js Web 應用框架,能用于構建 Web 服務器與 API。
    下載命令:
npm install express
  1. cors:該模塊用于解決跨域資源共享(CORS)問題,允許服務器接受來自不同源的請求。
    下載命令:
npm install cors
  1. mysql2/promise:此模塊為 MySQL 數據庫提供了支持,并且采用了 Promise 風格的 API。
    下載命令:
npm install mysql2
  1. multer:這是一個用于處理 multipart/form-data 類型表單數據的中間件,通常用于文件上傳。
    下載命令:
npm install multer
  1. 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對象來獲取相關信息。

  1. 處理 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 中的查詢參數,將其轉換為一個對象方便后續處理。

  1. 處理 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
  1. 處理 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');
});
  1. 處理 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');
});
  1. 處理 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獲取。

(三)其他數據格式處理

  1. 處理表單數據(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的單個文件上傳。

  1. 處理 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,即傳遞的參數123的和。

需要注意的是,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將是一個包含nameage屬性的對象,即{ 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 請求參數相對復雜一些,因為數據是包含在請求體中,且可能以流的形式分塊傳輸。需要監聽dataend事件來獲取完整的請求體數據,然后根據數據格式進行解析。以下是一個簡單的示例,假設請求體數據為 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');});

在這個示例中,通過監聽reqdata事件,將接收到的每一塊數據累加到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中獲取相應的參數。例如,當發送一個包含usernamepassword的 JSON 格式的 POST 請求時,req.body將包含這些參數,我們可以通過req.body.usernamereq.body.password來獲取它們的值。

三、其他參數接收場景

(一)處理表單數據(multipart/form - data)

當涉及文件上傳等復雜表單數據時,需要使用專門的中間件來處理。multer是一個常用的處理multipart/form - data類型表單數據的中間件。

首先,需要安裝multernpm 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 對象。

先安裝xml2jsnpm 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');});

在這個示例中,通過監聽reqdata事件獲取 XML 數據,當end事件觸發時,使用xml2jsParser將 XML 數據解析為 JavaScript 對象,并根據解析結果返回相應的響應。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903708.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903708.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903708.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

從Markdown到專業文檔:如何用Python打造高效格式轉換工具

在技術寫作、學術研究和企業報告領域,Markdown因其簡潔高效的特性廣受開發者喜愛。但當需要輸出正式文檔時,Word和PDF格式仍是行業標準。傳統解決方案往往存在樣式丟失、代碼排版混亂、批量處理困難等痛點。本文將揭秘如何用Python構建一個支持多主題、保留代碼高亮、自動生成…

【docker學習筆記】如何刪除鏡像啟動默認命令

一些鏡像會在它打鏡像時&#xff0c;加入一些默認的啟動命令&#xff0c;可以通過docker inspect \<image id\>來查看Entrypoint。如下圖&#xff0c;docker run啟動時&#xff0c;會默認執行 "python3 -m vllm.entrypoints.openai.api_server" 如果不想執行&…

任意無人機手柄鏈接Unity-100元的鳳凰SM600手柄接入Unity Input System?

網上教程真少&#xff01;奮發圖強自力更生&#xff01;2025.5.1 目前有用的鏈接&#xff1a; unity如何添加自定義HID設備&#xff0c;自己開發的手柄如何支持unity。 - 嗶哩嗶哩 HID Support | Input System | 1.0.2 官方教程 https://zhuanlan.zhihu.com/p/503209742 分…

2024睿抗CAIP-編程技能賽-本科組(省賽)題解

藍橋杯拿了個省三&#xff0c;天梯沒進1隊&#xff0c;睿抗是我最后的機會 RC-u4 章魚圖的判斷 題目描述 對于無向圖 G ( V , E ) G(V,E) G(V,E)&#xff0c;我們定義章魚圖為&#xff1a; 有且僅有一個簡單環&#xff08;即沒有重復頂點的環&#xff09;&#xff0c;且所…

Java 泛型參數問題:‘ResponseData.this‘ cannot be referenced from a static contex

問題與處理策略 問題描述 Data AllArgsConstructor NoArgsConstructor public class ResponseData<T> {private Integer code;private String msg;private T data;public static final int CODE_SUCCESS 2001;public static final int CODE_FAIL 3001;public static …

用TCP實現服務器與客戶端的交互

目錄 一、TCP的特點 二、API介紹 1.ServerSocket 2.Socket 三、實現服務器 四、實現客戶端 五、測試解決bug 1.客戶端發送了數據之后&#xff0c;并沒有響應 2.clientSocket沒有執行close()操作 3.嘗試使用多個客戶端同時連接服務器 六、優化 1.短時間有大量客戶端訪…

鳥籠效應——AI與思維模型【84】

一、定義 鳥籠效應思維模型指的是人們在偶然獲得一件原本不需要的物品后,會為了這件物品的配套或使用需求,進而繼續添加更多與之相關但自己原本可能并不需要的東西,仿佛被這個“鳥籠”牽著走,最終陷入一種慣性消費或行為模式的現象。簡單來說,就是人們在心理上會有一種自…

加密解密記錄

一、RSA 加密解密 密鑰對生成 1.前端加密解密 &#xff08;1&#xff09;.vue頁面引入 npm install jsencrypt&#xff08;2&#xff09;工具 jsencrypt.js import JSEncrypt from jsencrypt/bin/jsencrypt.min// 密鑰對生成 http://web.chacuo.net/netrsakeypairconst p…

淺析 MegEngine 對 DTR 的實現與改進

分享筆者在學習 MegEngine 對 DTR 的實現時的筆記。關于 DTR 可以參考&#xff1a;【翻譯】DTR_ICLR 2021 文章目錄 MegEngine 架構設計MegEngine 的動態圖部分Imperative RuntimeImperative 與 MegDNN / MegBrain 的關系靜態圖運行時管家 —— MegBrain動態圖接口 —— Impera…

micro-app前端微服務原理解析

一、核心設計思想 基于 WebComponents 的組件化渲染 micro-app 借鑒 WebComponents 的 CustomElement 和 ShadowDom 特性&#xff0c;將子應用封裝為類似 WebComponent 的自定義標簽&#xff08;如 <micro-app>&#xff09;。通過 ShadowDom 的天然隔離機制&#xff0c;實…

CMake中強制啟用option定義變量的方法

在CMake中&#xff0c;若要在另一個CMake文件中強制啟用由option()定義的變量&#xff0c;可使用set(... FORCE)覆蓋緩存變量。具體步驟如下&#xff1a; 使用set命令強制覆蓋緩存&#xff1a; 在需要強制啟用選項的CMake文件中&#xff0c;使用set命令并指定CACHE和FORCE參數。…

C++漫溯鍵值的長河:map set

文章目錄 1.關聯式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的應用實踐&#xff1a;隨機鏈表的復制 5.multimap希望讀者們多多三連支持小編會繼續更新你們的鼓勵就是我前進的動…

汽車用品商城小程序源碼介紹

基于ThinkPHPFastAdminUniApp開發的汽車用品商城小程序源碼&#xff0c;從技術架構來看&#xff0c;ThinkPHP作為后端框架&#xff0c;提供了穩定且高效的開發基礎&#xff0c;能夠處理復雜的業務邏輯和數據交互。FastAdmin則進一步簡化了后臺管理系統的開發流程&#xff0c;提…

力扣hot100——114.二叉樹展開為鏈表

基于 Morris 遍歷思想 將左子樹插到右子樹的位置&#xff0c;將原來的右子樹插到左子樹的最右結點&#xff0c;遍歷右結點重復以上步驟&#xff0c;直至右結點為空。 class Solution { public:void flatten(TreeNode* root) {if(rootnullptr) return;while(root){if(!root-&g…

JConsole監控centos服務器中的springboot的服務

場景 在centos服務器中,有一個aa.jar的springboot服務,我想用JConsole監控它的JVM情況,具體怎么實現。 配置 Spring Boot 應用以啟用 JMX 在java應用啟動項進行配置 java -Djava.rmi.server.hostname=服務器IP -Dcom.sun.management.jmxremote=true \ -Dcom.sun.managem…

39.RocketMQ高性能核心原理與源碼架構剖析

1. 源碼環境搭建 1.1 主要功能模塊 ? RocketMQ的官方Git倉庫地址&#xff1a;GitHub - apache/rocketmq: Apache RocketMQ is a cloud native messaging and streaming platform, making it simple to build event-driven applications. ? RocketMQ的官方網站上下載指定版…

施磊老師rpc(一)

文章目錄 mprpc項目**項目概述**&#xff1a;深入學習到什么**前置學習建議**&#xff1a;核心內容其他技術與工具**項目特點與要求**&#xff1a;**環境準備**&#xff1a; 技術棧集群和分布式理論單機聊天服務器案例分析集群聊天服務器分析分布式系統介紹多個模塊的局限引入分…

基于LangChain構建最小智能體(Agent)實現指南

摘要 本文完整解析基于LangChain的極簡Agent實現方案&#xff0c;通過26行代碼構建具備網絡搜索能力的對話系統&#xff0c;涵蓋Agent初始化、工具集成、流式回調等核心技術要點。適用于LLM應用開發者快速入門Agent開發。(參考項目代碼&#xff1a;Minimal Agent) 系統架構設計…

AWTK:一鍵切換皮膚,打造個性化UI

想讓你的應用在不同場景下都能完美呈現嗎&#xff1f;皮膚切換功能必不可少&#xff01;本文將介紹AWTK&#xff0c;一款強大的GUI框架&#xff0c;它通過內置資源管理和優化緩存&#xff0c;輕松實現皮膚切換功能。 前言 當今的UI應用中&#xff0c;為了滿足不同使用場景和…

【Vagrant+VirtualBox創建自動化虛擬環境】Ansible測試Playbook

文章目錄 Vagrant安裝vagrant安裝 VirtualBox如何使用 Ansible安裝AnsiblePlaybook測試創建hosts文件創建setup.yml文件 Vagrant Vagrant是一個基于Ruby的工具&#xff0c;用于創建和部署虛擬化開發環境。它使用Oracle的開源VirtualBox虛擬化系統&#xff0c;使用 Chef創建自動…