使用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创建自动…