node.js 解析post请求 方法一

前提:依旧以前面发的node.js服务器动态资源处理代码 具体见 http://t.csdnimg.cn/TSNW9为模板,在这基础上进行修改。与动态资源处理代码不同的是,这次的用户信息我们借用表单来实现。post请求解析来获取和展示用户表单填写信息

1》代码难点:

解析post请求方法一的重点在于——注册和登录表单在处理查询参数(query)时使用了不同的方法。这是因为这两种表单的处理方式在HTTP请求的结构上有所不同。注册表单使用的是post请求,登录表单使用的是get请求。

在POST请求中,数据位于请求体中,而在GET请求中,数据位于URL的查询字符串中。

2》具体要求:

完成注册、登录、已注册的用户表单展示功能(也就是表单填写的用户名、密码、性别这三个信息。此处文件上传功能方法一不能实现,如要实现文件上传请见方法二)

一、解析post请求方法一介绍

因为Node.js 没有提供直接解析POST请求提交的数据的模块;

 所以一般是通过request的data和end事件获取请求报文中请求正文的内容后再解析。

二、资源配置

(1)页面配置

我们将首页index.html、登录login.html、注册regist.html、用户表单注册信息users.html、错误提示模板页面404.html这五个html页面写在views这个大文件夹下。样式mian.css和图片和表单提交的图片分别放入public这个大文件夹下的css、images、head文件下。最后创建一个data大文件夹,data下面建一个user.json文件来专门存储用户数据。解析post请求方法一的服务器代码我写入serve.js下。后继写的解析post请求方法二的服务器代码我将写在serve2.js下。

用户列表渲染功能index.html就是可以将我的user.json里面注册成功的用户表单数据渲染到我的服务器用户列表页面

index.html页面、login.html页面、404.html页面与我动态资源处理代码里写的一致,此处略写。 见 http://t.csdnimg.cn/TSNW9 

regist.html页面:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>注册</title><link rel="stylesheet" href="../public/css/main.css">
</head>
<body><h1>注册</h1><img src="../public/images/01.png" alt=""><br><form method="post" action="/doRegist"> <input type="text" name="username" placeholder="用户名"><br><input type="password" name="password" placeholder="密码"><br><input type="radio" name="gender" value="男" checked>男<input type="radio" name="gender" value="女">女<br><input type="file" name="head" multiple><br>  <!-- multiple允许选择多个文件 --><input type="submit" value="注册"><br> </form>
</body>
</html>
users.html页面:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>用户列表</title><link rel="stylesheet" href="../public/css/main.css">
</head><body><h1>用户列表</h1><img src="../public/images/01.png" alt=""><br><table><thead><tr><td>用户名</td><td>密码</td><td>性别</td><td>头像</td></tr></thead><tbody><!-- 遍历json里的数组 --><% for(var user of users){ %><tr><td><%= user.username %></td><td><%= user.password %></td><td><%= user.gender %></td><td><img src="../public/head/<%= user.head %>" width="50"></td></tr><% } %></tbody></table>
</body></html>
users.json页面:
[]

(2)在我的测试代码的终端 npm install underscore -save安装underscore渲染模板引擎 、npm install querystring安装querystring查询模块

三、代码实现

(1) 测试代码serve.js如下:

//serve.js 解析post请求 法一
// 通过request的data和end事件获取请求报文中请求正文的内容后再解析
const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 导入查询参数的模块
const querystring = require('querystring');
// 声明一个专门存放所有用户的变量
var users;
// 导入underscore渲染模板
const _ = require('underscore');
//使用underscore渲染模板
function render(data){//读取模板内容let temp=fs.readFileSync(path.join(__dirname,'views/404.html'));// 获取渲染函数let compiled=_.template(temp.toString());//渲染模板return compiled(data);
}
//读取文件。读取users.json存放的用户数据文件
fs.readFile(path.join(__dirname,'data/users.json'),(err,data)=>{if(err){return;}else{//如果读取正确就将读到的内容转换为一个对象存到users里users=JSON.parse(data.toString());}
})
//创建服务器
const server=http.createSever();
//服务器做出请求响应
server.on('request',(req,res)=>{//将url转为一个对象才能获取到它的pathnamelet objurl=url.parse(req.url);let pathname = objurl.pathname;// 对pathname做处理// 首先解决静态资源处理  (判断方法:startWith、indexOf、search、includes)// startsWith方法  以什么开头if (pathname.startsWith('/public')) {// 找到当前项目文件夹,再将相对路径转为绝对路径let p = path.join(__dirname, pathname);fs.readFile(p, (err, data) => {if (err) {//可以使用中文,因为现在是html页面去显示的res.end(render({ msg: '访问的文件不存在' })); } else {res.end(data);}})}else if(pathname == '/' || pathname == '/home'){let p = path.join(__dirname, 'views/index.html');fs.readFile(p, (err, data) => {if (err) {res.end(render({ msg: '访问的文件不存在' }));} else {res.end(data);}})}else if(pathname == '/regist'){let p = path.join(__dirname, 'views/regist.html');fs.readFile(p, (err, data) => {if (err) {res.end(render({ msg: '访问的文件不存在' }));} else {res.end(data);}})}else if(pathname == '/login'){let p = path.join(__dirname, 'views/login.html');fs.readFile(p, (err, data) => {if (err) {res.end(render({ msg: '访问的文件不存在' }));} else {res.end(data);}})}else if(pathname == '/doLogin'){ //登录表单let query = querystring.parse(objurl.query); //登录表单通常使用GET请求。处理get请求方法一借助querystring模块。querystring.parse(req.url.query) 将字符串参数解析成对象let username = query.username;let password = query.password;// 声明一个变量result代表我的判断结果let result = false;for (let user of users) {if (user.username == username && user.password == password) {result = true;break;}}if (result) {res.end(render({ msg: '登录成功' }));} else {res.end(render({ msg: '用户名或密码错误,登录失败' }));}}else if(pathname == '/doRegist' && req.method.toLowerCase() == 'post'){ //注册表单 此处为post请求解析过程。最重要。注意let chunk = '';  //chunk是一个字符串对象,是为了收集或缓存从请求中传入的数据req.on('data', (data) => { //事件监听器,它监听req上的data事件。当HTTP请求体中有数据可读时,这个事件就会被触发chunk += data; //当data事件被触发时,它会执行这个函数。函数内部,它将传入的数据data追加到churk字符串上。这意味着,随着数据逐渐流入,churk将积累所有的数据。});req.on('end', () => {// 上面读取完毕开始注册操作let query=querystring.parse(chunk); // //使用POST请求时,请求体(req.body)包含要发送到服务器的数据,而不是URL的查询字符串(req.url). 因此,我们需要监听data和end事件来收集从请求体中传入的数据。在data事件中,我将传入的数据片段添加到chunk变量中,然后在end事件中,解析这个chunk(通常是一个Buffer或字符串),以获取查询参数let username=query.username;let password=query.password;let gender=query.gender;let user={username:username,password:password,gender:gender,head:''}users.push(user);fs.writeFile(path.join(__dirname,'data/users.json'),JSON.stringify(users),(err)=>{if(err){res.end(render({msg:'注册失败'}));}else{// 注册成功// 重定向(服务器端主动发起一个请求)到登录页面res.writeHead(302,{'Location':'/login'});res.end();}})});}else if(pathname == '/list'){
let p = path.join(__dirname, 'views/users.html');fs.readFile(p, (err, data) => {if (err) {res.end(render({ msg: '访问的文件不存在' }));} else {//获得渲染函数 let compiled = _.template(data.toString());// 调用渲染函数来生成html内容let html = compiled({ users: users }); //我们在模板里取的是users的属性, 所以不能简写成users,而是users:usersres.end(html);}})}
});//启动监听
server.listen(3000, '127.0.0.1', () => {console.log('Server is running at http://127.0.0.1:3000');
})

***重难点:

(4)注意:解析post请求方法一的重点在于——注册和登录表单在处理查询参数(query)时使用了不同的方法。这是因为这两种表单的处理方式在HTTP请求的结构上有所不同。

  1. 注册表单(POST请求)

    • 当您提交注册表单时,通常使用POST请求,因为它涉及到向服务器发送数据(在这种情况下是注册信息)。
    • 当您使用POST请求时,请求体(req.body)包含要发送到服务器的数据,而不是URL的查询字符串(req.url)。
    • 因此,您需要监听dataend事件来收集从请求体中传入的数据。在data事件中,您将传入的数据片段添加到chunk变量中,然后在end事件中,您解析这个chunk(通常是一个Buffer或字符串),以获取查询参数。
  2. 登录表单(GET请求)

    • 登录表单通常使用GET请求,因为它不涉及向服务器发送大量数据。相反,它可能只是请求用户信息(如用户名和密码)来验证用户身份。
    • GET请求中,请求参数被附加到URL的末尾,并作为查询字符串出现。
    • 由于查询字符串是URL的一部分,您可以直接从req.url中获取它,并使用querystring.parse()来解析它。您使用的url.parse(req.url)方法会返回一个对象,其中包含URL的不同部分,包括查询字符串,然后您可以使用querystring.parse()来解析查询字符串。

总之,注册和登录表单在处理查询参数时使用不同的方法,因为它们使用了不同类型的HTTP请求(POSTGET),并且数据在请求中的位置不同。

POST请求中,数据位于请求体中,而在GET请求中,数据位于URL的查询字符串中。

(2)运行结果如图所示

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/828276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【项目实战】基于高并发服务器的搜索引擎

【项目实战】基于高并发服务器的搜索引擎 目录 【项目实战】基于高并发服务器的搜索引擎搜索引擎部分代码index.htmlindex.hpplog.hppparser.cc&#xff08;用于对网页的html文件切分且存储索引关系&#xff09;searcher.hpputil.hpphttp_server.cc&#xff08;用于启动服务器和…

WPForms Pro插件下载:简化您的在线表单构建,提升用户互动

在当今的数字化世界中&#xff0c;表单是网站与用户互动的关键。无论是收集信息、处理订单还是进行调查&#xff0c;一个好的表单可以极大地提升用户体验和转化率。WPForms Pro插件&#xff0c;作为一款专业的WordPress表单构建工具&#xff0c;旨在帮助您轻松创建美观、功能强…

深度学习基础:循环神经网络中的Dropout

深度学习基础&#xff1a;循环神经网络中的Dropout 在深度学习中&#xff0c;过拟合是一个常见的问题&#xff0c;特别是在循环神经网络&#xff08;RNN&#xff09;等复杂模型中。为了应对过拟合问题&#xff0c;研究者们提出了许多方法&#xff0c;其中一种被广泛应用的方法…

TensorFlow进阶一(张量的范数、最值、均值、和函数、张量的比较)

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

短视频评论ID批量爬虫提取获客软件|视频评论下载采集工具

短视频评论批量抓取软件&#xff1a;智能拓客&#xff0c;精准抓取用户反馈 主要功能一览 1. 智能抓取任务创建&#xff1a; 软件提供了任务创建功能&#xff0c;用户只需输入任务名称、搜索关键词以及评论监控词&#xff0c;即可开始智能抓取。不仅能够搜索关键词匹配的视频…

Gradio 最快创建Web 界面部署到服务器并演示机器学习模型,本文提供教学案例以及部署方法,避免使用繁琐的django

最近学习hugging face里面的物体检测模型&#xff0c;发现一个方便快捷的工具&#xff01; Gradio 是通过友好的 Web 界面演示机器学习模型的最快方式&#xff0c;以便任何人都可以在任何地方使用它&#xff01; 一、核心优势&#xff1a; 使用这个开发这种演示机器学习模型的…

就业班 第三阶段(负载均衡) 2401--4.19 day3

二、企业 keepalived 高可用项目实战 1、Keepalived VRRP 介绍 keepalived是什么keepalived是集群管理中保证集群高可用的一个服务软件&#xff0c;用来防止单点故障。 ​ keepalived工作原理keepalived是以VRRP协议为实现基础的&#xff0c;VRRP全称Virtual Router Redundan…

前端开发攻略---封装calendar日历组件,实现日期多选。可根据您的需求任意调整,可玩性强。

1、演示 2、简介 1、该日历组件是纯手搓出来的&#xff0c;没依赖任何组件库&#xff0c;因此您可以随意又轻松的改变代码&#xff0c;以实现您的需求。 2、代码清爽干净&#xff0c;逻辑精妙&#xff0c;您可以好好品尝。 3、好戏开场。 3、代码&#xff08;Vue3写法&#xff…

探索Web3:去中心化的互联网新时代

引言 在过去的几十年里&#xff0c;互联网已经改变了我们的生活方式、商业模式以及社交互动方式。然而&#xff0c;一个新的技术浪潮——Web3正在崭露头角&#xff0c;预示着一个去中心化的互联网新时代的来临。本文将深入探讨Web3技术的定义、特点以及其对未来互联网发展的影…

【数据结构-图】

目录 1 图2 图的定义和基本概念&#xff08;在简单图范围内&#xff09;3 图的类型定义4 图的存储结构4.1 邻接矩阵 表示法4.2 邻接表 表示法4.3 十字链表 表示法4.4 邻接多重表 表示法 5 图的遍历5.1 深度优先搜索-DFS 及 广度优先遍历-BFS 6 图的应用6.1 最小生成树6.1.1 克鲁…

vue cli3开发自己的插件发布到npm

具体流程如下&#xff1a; 1、创建一个vue项目 vue create project 2、编写组件 &#xff08;1&#xff09;新建一个plugins文件夹&#xff08;可自行创建&#xff09; &#xff08;2&#xff09;新建Button组件 &#xff08;3&#xff09;组件挂载&#xff0c;为组件提供 in…

Python绘制3D曲面图

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中绘制3D曲面图的艺术 在数据可视化的世界中&#xff0c;3D曲面图是一种强大的工…

数据链路层(计算机网络,待完善)

0、前言 本文大多数图片都来自于 B站UP主&#xff1a;湖科大教书匠 的教学视频&#xff0c;对高军老师及其团队制作出这么优质的课程表示感谢。文章增加了部分个人理解&#xff0c;内容并不是对视频的静态化翻译。 1、概述 1.1、数据链路层在计算机网络体系中的位置 1.2、对…

Jenkins集成Terraform实现阿里云CDN自动刷新

在互联网业务中&#xff0c;CDN的应用已经成了普遍&#xff0c;SRE的日常需求中&#xff0c;CDN的刷新在前端需求逐渐中占了很大比例&#xff0c;并且比较琐碎。做为合格的SRE&#xff0c;把一切自动化是终极使命&#xff0c;而今天就分享通过JenkinsTerraform实现阿里云的CDN自…

CISSP通关学习笔记:共计 9 个章节(已完结)

1. 笔记说明 第 0 章节为开篇介绍&#xff0c;不包括知识点。第 1 - 8 章节为知识点梳理汇总&#xff0c;8 个章节的知识框架关系如下图所示&#xff1a; 2. 笔记目录 「 CISSP学习笔记 」0.开篇「 CISSP学习笔记 」1.安全与风险管理「 CISSP学习笔记 」2.资产安全「 CISSP…

机器学习/算法工程师面试题目与答案-深度学习部分1

机器学习/算法工程师面试题目与答案-深度学习部分 BatchNormalization的作用梯度消失循环神经网络&#xff0c;为什么好?什么是GroupConvolution什么是RNN神经网络中权重共享的是&#xff1f;神经网络激活函数&#xff1f;为什么在深度学习中常进行finetuning画GRU结构图什么是…

Flink CDC详解

文章目录 Flink CDC一 CDC简介1.1 CDC定义1.2 CDC应用场景1.3 CDC实现机制1.4 开源CDC工具对比 二 Flink CDC简介2.1 Flink CDC介绍2.2 Flink CDC Connector(连接器)2.3 Flink CDC && Flink版本2.4 Flink CDC特点 三 Flink CDC发展3.1 发展历程3.2 背景Dynamic Table &…

51单片机入门_江协科技_35~36_OB记录的自学笔记_AD与DA转换(XPT2046)

35. AD_DA 35.1. AD/DA介绍 •AD&#xff08;Analog to Digital&#xff09;&#xff1a;模拟-数字转换&#xff0c;将模拟信号转换为计算机可操作的数字信号 •DA&#xff08;Digital to Analog&#xff09;&#xff1a;数字-模拟转换&#xff0c;将计算机输出的数字信号转换…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

信息系统项目管理师论文考察范围预测

在2023年下半年实施机考之前&#xff0c;论文的范围还是比较好预测的&#xff0c;因为从历年考题来看&#xff0c;可以说十大管理领域考察的概率接近100%&#xff0c;而且有一定规律&#xff0c;比如说某个管理领域很久没考了&#xff0c;那么考察的概率就相对大一点&#xff0…