node.js 解析post请求 方法二

前提:以前面发的node.js解析post请求方法一为模板,具体见 http://t.csdnimg.cn/ABaIn

此文我们运用第二种方法:使用第三方模块formidable对post请求进行解析。

1》代码难点 ***

在Node.js中使用formidable模块来解析POST请求主要涉及到处理文件上传和多部分表单数据(multipart/form-data)以及验证上传内容的重难点。

难点解决思路:你需要创建一个formidable的实例来处理上传的表单数据。

formidable模块会将这些文件临时存储在服务器的某个位置,你需要处理这些临时文件,可能包括移动它们到最终目标的位置。

一、具体要求:

完成注册、登录、已注册的用户表单展示、文件上传功能(也就是表单填写的用户名、密码、性别这三个信息。以及选择的图片上传功能)

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

解析post请求可以通过第三方模块进行解析,如:formidable、body-parser模块等等。此处我们使用最常用的formidable模块来进行操作

三、资源配置

(1)在终端 npm install formidable -save安装formidable模块

(2)页面配置

https://blog.csdn.net/2301_76669854/article/details/138170325里的页面配置相同。唯一不同的点在于我的注册html页面。因为  enctype="multipart/form-data"涉及到文件上传,所以在方法二:使用formidable模块解析post请求时需要添加。需要保持数据格式一致。

方法二中views文件夹下的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" enctype="multipart/form-data"> <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>

(3)在终端 npm install underscore -save安装underscore渲染模板引擎 、npm install querystring安装querystring查询模块

四、代码实现

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

const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 导入formidable模块
const formidable = require('formidable');
// 声明一个专门存放所有用户的变量
var users;
// 导入查询参数的模块
const querystring = require('querystring')
// 导入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);
}
//创建服务器
const server = http.createServer();
//读取文件。读取user.json存放用户数据的文件
fs.readFile(path.join(__dirname, 'data/users.json'), (err, data) => {if (err) {return;} else {users = JSON.parse(data.toString()); //如果读取正确就将读到的内容转换为一个对象存到users里}
})
//服务器做出请求响应
server.on('request', (req, res) => {let objurl = url.parse(req.url); //将url转为一个对象才能获取到它的pathnamelet 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) {res.end(render({ msg: '访问的文件不存在' })); //可以使用中文,因为现在是html页面去显示的} 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') { //建一个文件夹data专门来储存数据 里面建一个users.json的文件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);let username = query.username;let password = query.password;// 声明一个变量代表我的判断结果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') {//一、创建新的IncomingForm实例var form = new formidable.IncomingForm({//uploadDir指定上传文件应储存的目录//keepExtensions设为true 意思是 在保存上传的文件时保留其原始拓展名。// multiples设为true 意思是允许上传多个文件uploadDir: path.join(__dirname, 'public/head/'),keepExtensions: true,multiples: true});// 二、解析请求form.parse(req, (err, fields, files) => { //form.parse(req,callback)方法用于解析传入的请求req中的数据,解析完成后调用回调函数// err 若解析错误则err是包含的错误信息// fields 一个包含所有文本字段的对象。这些字段是由表单中的input标签或其他文本输入元素提交的(也就是我表单填写好上传的数据)// files 一个包含所有上传文件的对象if (err) {console.log(err.message);} else {// 若请求解析成功则创建一个新的user对象。该对象包含从表单字段中获取的 username、password、gender、headlet user = {username: fields.username,password: fields.password,gender: fields.gender,head: files.head[0].newFilename //files.head表示regist.html上传的文件<input type="file" name="head" multiple>中的name名为head的字段。由于files.head是一个数组,所以需要files.head[0]来表示上传的第一个head文件。newFilename是由中间件在处理文件上传保存时的新文件名。可自定义}users.push(user); //将这个 user 对象添加到 users 数组的末尾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');
})

(2)运行结果如图所示

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

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

相关文章

IO流基础

IO流介绍 1.什么是IO流&#xff1f; 流是一种抽象概念&#xff0c;它代表了数据的无结构化传递。按照流的方式进行输入输出&#xff0c;数据被当成无结构的字节序列或字符序列。从流中取得数据的操作称为提取操作&#xff0c;而向流中添加数据的操作称为插入操作。用来进行输入…

JVM (Micrometer)监控SpringBoot(AWS EKS版)

问题 怎样使用JVM (Micrometer)面板&#xff0c;监控Spring&#xff1f;这里不涉及Prometheus和Grafana&#xff0c;重点介绍与Micrometer与Springboot&#xff0c;k8s怎样集成。 pom.xml 引入依赖&#xff0c;如下&#xff1a; <properties><micrometer.version&…

免费简单好用的内网穿透工具(ngrok、natapp),微信回调地址配置

B站视频地址 文章目录 Natapp1、登录注册账号、下载软件2、使用2-1、购买隧道、查看token2-2、端口穿透 Ngrok1、登录注册账号、下载软件2、使用2-1、获取并设置 token2-2、使用 3、隧道 微信回调配置1、注册测试公众号2、回调代码3、回调配置 在一些特殊的场景下&#xff0c;需…

多种方法求1+12+123+1234……

有网友出了一道题&#xff1a; 从键盘输入一个小于10的正整数n&#xff0c;计算1121231234……&#xff0c;即前n项之和。 第一眼看到题目&#xff0c;直觉告诉我必须使用嵌套的两个for循环&#xff0c;里面的循环生成每一项&#xff0c;外面的循环求和。错误的方向和思路让我…

基于RBF-PID控制器的风力发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于RBF-PID控制器的风力发电系统simulink建模与仿真,对比PID控制器和RBF-PID控制器的控制结果。 2.系统仿真结果 3.核心程序与模型 版本&#xff1a;MATLAB2022a 0050 4.系…

Unity进阶之ScriptableObject

目录 ScriptableObject 概述ScriptableObject数据文件的创建数据文件的使用非持久数据让其真正意义上的持久ScriptableObject的应用配置数据复用数据数据带来的多态行为单例模式化的获取数据 ScriptableObject 概述 ScriptableObject是什么 ScriptableObject是Unity提供的一个…

有没有电脑桌面监控软件|十大电脑屏幕监控软件超全盘点!

电脑桌面监控软件已经成为许多领域不可或缺的工具。 无论是企业为了保障数据安全和提高工作效率&#xff0c;还是家长为了监督孩子的学习&#xff0c;甚至是个人为了记录电脑使用行为&#xff0c;都需要这类软件的支持。 本文将对市面上十大电脑屏幕监控软件进行超全盘点&…

智能文案生成器,文案生成改写很强大

在当今数字化时代&#xff0c;随着人工智能的迅猛发展&#xff0c;智能文案生成器正逐渐成为营销和创作领域的一大利器。这些智能工具不仅能够快速生成文案&#xff0c;还能够进行文案改写&#xff0c;使得文案生成的过程更加高效、便捷。正是在这样的背景下&#xff0c;智能文…

CAT:contig稳健物种分类

安装 mamba create -n CAT python3.10 diamond prodigal cd SoftWare git clone https://github.com/MGXlab/CAT_pack chmod 755 给权限 自己构建数据库 names.dmp nodes.dmp文件可以在Kraken2的文件里面找到 Kraken2Bracken&#xff1a;宏基因组物种注释_kracken2配合bracke…

MySQL之binlog归档日志

binlog&#xff08;二进制归档日志&#xff09; binlog 二进制日志记录保存所有执行过的修改操作语句&#xff0c;不保存查询操作。如果 MySQL 服务意外停止&#xff0c;可通过二进制日志文件排查&#xff0c;用户操作或表结构操作&#xff0c;从而来恢复数据库数据。启动 bin…

Java 线程的几种状态

一、 线程的状态 状态是针对当前的线程调度的情况来描述的。因为线程是调度的基本单位&#xff0c;所以状态更应该是线程的属性。在Java中线程的状态一共有六种&#xff1a; 1. 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。 2. 运行(RUNN…

动静态库以及动态链接

文章目录 静态库制作静态库如何使用静态库 动态库动态库的制作动态库的使用动态链接 库是给别人用的&#xff0c;所以库中一定不存在main函数。库一般会有lib前缀和后缀&#xff0c;去掉前缀和后缀才是库名。 静态库 静态库&#xff08;.a&#xff09;&#xff1a;程序在编译…

C++|对象与const

目录 常对象 常对象的声明 性质 数据成员不能被修改 常对象不能调用非const成员函数 const型成员函数 常对象成员 常数据成员 常成员函数 注意 总结 const型数据成员 const型成员函数 常对象 指针与const 指向对象的常指针 应用场景 指向常对象的指针 指向常…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程&#xff0c;只是记录一下本人的操作&#xff0c;感兴趣的可以看下 一、默认地址 http://localhost:…

【1731】jsp 房租跟踪监控管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 房租跟踪监控管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysq…

Java 基础常见面试题整理

目录 1、java的基本数据类型有哪些&#xff1f;2、java为什么要有包装类型&#xff1f;3、String a "123" 和 String a new String("123") 区别&#xff1f;4、String、StringBuilder和StringBuffer的区别&#xff1f;5、如何理解面向对象和面向过程&…

浅谈叉车车载电脑的市场现状

叉车的起源 叉车源于美国&#xff0c;兴于日本&#xff0c;虽然中国起步较晚&#xff0c;但是近些年来发展迅速。叉车又称叉式装载车&#xff0c;是对于成件托盘类货物进行装卸、堆垛和短距离运输&#xff0c;实现重物搬运作业的轮式工业车辆。 叉车的分类 叉车分为以上六大类…

CSS学习(选择器、盒子模型)

1、CSS了解 CSS&#xff1a;层叠样式表&#xff0c;一种标记语言&#xff0c;用于给HTML结构设置样式。 样式&#xff1a;文字大小、背景颜色等 p标签内不能嵌套标题标签。 px是相对于分辨率而言的&#xff0c; em是相对于浏览器的默认字体&#xff0c; rem是相对于HTML根元…

刷题日记 ---- 顺序表与链表相关经典算法题(C语言版)

目录 1. 移除元素2. 合并两个有序数组3. 移除链表元素4. 反转链表5. 合并两个有序链表6. 链表的中间结点7. 环形链表的约瑟夫问题8. 分割链表总结 正文开始 1. 移除元素 题目链接: 移除元素 题目描述: 思路历程: 题目明确要求, 不能使用额外的数组空间, 也就是说不可以创建…

【优质书籍推荐】AIGC时代的PyTorch 深度学习与企业级项目实战

大家好&#xff0c;我是herosunly。985院校硕士毕业&#xff0c;现担任算法研究员一职&#xff0c;热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名&#xff0c;CCF比赛第二名&#xff0c;科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的…