node.js服务器静态资源处理

前言:node.js服务器动态资源处理见 http://t.csdnimg.cn/9D8WN

一、什么是node.js服务器静态资源?

静态资源服务器指的是不会被服务器的动态运行所改变或者生成的文件. 它最初在服务器运行之前是什么样子, 到服务器结束运行时, 它还是那个样子. 比如平时写的 js, css, html文件, 都可以算是静态资源。

我的静态服务器需要使用json文件作为数据存储。并进行json数据的读取与写入。

下面,我将以在服务器中实现注册、登录为例并将我已注册的用户数据写到我的user.json中。

二、服务器处理静态资源执行思路:

(1)将所有静态资源统一放入一个文件夹中做统一处理

(2)在服务器端来处理pathname从而判断url是否是我们请求的路径

如何解析和格式化url查询字符串?

 Node.js 的 querystring 模块:

1. 将字符串参数解析成对象

querystring.parse(url)

2. 将对象参数解析成字符串

 querystring.stringify(urlObject)

三、静态资源处理的判断方法:

startWith(以什么开头)、indexOf、search、includes
 

四、执行要求:

静态资源要求:完成注册、登录功能

动态资源要求:完成注册、登录、已注册的用户列表展示功能

五、执行代码:

执行结果见视频:

20240415_142226

node.js服务器静态资源处理:

(1)我们将首页、登录、注册三个html静态页面和用户列表users.html写在views这个大文件夹下。css样式和images图片放入public这个大文件夹下。创建一个data大文件夹,data下面建一个user.json文件来专门存储用户数据

简单写一下首页、注册、登录页面的html静态页面的样式。

1》index.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><a href="/login">登录</a>|<a href="/regist">注册</a>|<a href="/list">用户列表</a>
</body>
</html>

2》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="get" action="/doRegist"><input type="text" name="username" placeholder="用户名"><br><input type="password" name="password" placeholder="密码"><br><input type="submit" value="注册"><br></form>
</body>
</html>

3》login.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="get" action="/doLogin"><input type="text" name="username" placeholder="用户名"><br><input type="password" name="password" placeholder="密码"><br><input type="submit" value="登录"><br></form>
</body>
</html>

index.html 首页显示如下:

(2)测试代码:

创建一个服务器,使服务器做出响应的请求与响应(重点:对解析后的url的pathname来做出不同的if判断处理)

const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 声明一个专门存放所有用户的变量
var users;
// 导入查询参数的模块
const querystring = require('querystring')
//创建服务器
const server = http.createServer();
//读取文件。读取user.json存放用户数据的文件
fs.readFile(path.join(__dirname, 'data/users.json'), (err, data) => {if (err) {users = {};} else {users = JSON.parse(data.toString()); //如果读取正确就将读到的内容转换为一个对象存到users里}
})
//服务器做出请求响应
// 设置服务器的监听器来响应'request'事件。当有人向服务器发送请求时,这个事件就会被触发
server.on('request', (req, res) => {let objurl = url.parse(req.url); //将包含了客户端请求的完整URL(req.url)转为一个对象才能获取到它的pathnamelet pathname = objurl.pathname;  //从解析后的URL对象objurl中提取出路径名// 对pathname做处理if (pathname.startsWith('/public')) {// 找到当前项目文件夹,再将相对路径转为绝对路径let p = path.join(__dirname, pathname);fs.readFile(p, (err, data) => {if (err) {res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });res.end('404 Not Found');} 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.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });res.end('404 Not Found');} else {res.end(data);}})} else if (pathname == '/regist') {let p = path.join(__dirname, 'views/regist.html');fs.readFile(p, (err, data) => {if (err) {res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });res.end('404 Not Found');} else {res.end(data);}})} else if (pathname == '/login') {let p = path.join(__dirname, 'views/login.html');fs.readFile(p, (err, data) => {if (err) {res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });res.end('404 Not Found');} else {res.end(data);}})
//已注册或已登录的情况:} else if (pathname == '/doRegist') {let query = querystring.parse(objurl.query); //将字符串参数解析成对象let username = query.username;let password = query.password;if (users[username]) {res.writeHead(500, { 'Content-Type': 'text/html;charset=utf-8' });res.end('用户名已存在,不能注册!');} else {//因为users里面是一个对象。所以只能属性名=值的形式。故用户名 / 密码 为属性名 = 用户名的值 / 密码的值 为属性值users[username] = password;//利用JSON.stringify(users)将users对象转为字符串重新写到文件里去fs.writeFile(path.join(__dirname, 'data/users.json'), JSON.stringify(users), (err) => {if (err) {res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });res.end('注册失败');} else {res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });res.end('注册成功')}})}} else if (pathname == '/doLogin') {let query = querystring.parse(objurl.query);let username = query.username;let password = query.password;// 判断users的用户名和密码有无if (users[username] && users[username] == password) { //用户名 && 密码res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });res.end('登录成功');} else {res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });res.end('用户名或密码错误,登录失败');}} else if (pathname == '/list') {
//显示list用户列表是动态资源处理的内容。见我的下一篇博客 }
});
//启动服务器
server.listen(3000, '127.0.0.1', () => {console.log('Server is running at http://127.0.0.1:3000');
})

(3)结果显示

此时我的用户数据就显示在了我的data文件夹下的user.json上了

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

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

相关文章

github 双因素验证

环境 华为手机 下载app 华为应用市场下载 输入对应验证码&#xff0c;然后一路下一步即可 联系方式 手机&#xff1a;13822161573 微信&#xff1a;txsolarterms QQ&#xff1a;419396409

腾讯客户端开发实习一面

听说腾讯25年5000offer&#xff0c;我就去了...投完简历&#xff0c;当天晚上做完测评&#xff0c;第二天下午打电话约了第三天面试&#xff0c;额流程很快&#xff0c;快到第三天就寄了... 写在这里做个记录&#xff0c;也可以给学习学妹们经验&#xff0c;文末也有大厂面经合…

人工智能研究生前置知识—扩展程序库Pandas

人工智能研究生前置知识—扩展程序库Pandas pandas简介 Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;。Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。 pandas的官网&#xff1a;https://pandas.…

BGI | STCellBin:动植物组织细胞分割

简介 STCellbin 利用细胞核染色图像作为桥梁来获取与空间基因表达图谱对齐的细胞膜/壁染色图像。通过采用先进的细胞分割技术&#xff0c;可以获得准确的细胞边界&#xff0c;从而获得更可靠的单细胞空间基因表达谱。此次更新的增强功能为细胞内基因表达的空间组织提供了宝贵的…

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题5 第一阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第一阶段试题&#xff0c;第一阶段内容包括&#xff1a;网络平台搭建与设备安全防护。 本次比赛时间为180分钟。 介绍 竞赛阶段…

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…

ssm050助学贷款+jsp

助学贷款管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本助学贷款管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短…

噪音日冷知识:你的耳朵能承受多大的噪音?降噪耳机真的有用吗?

分贝——是对人类能听到的声音大小的一种数值化、可视化的描述。分贝数值越大&#xff0c;表示声音越大。 我们每天都能听到各种各样的声音&#xff0c;但你有关注过声音大小背后的意义吗&#xff1f;4月16日是国际噪音日&#xff0c;值此之际&#xff0c;带你了解下有关“声音…

第十届 蓝桥杯 单片机设计与开发项目 省赛

第十届 蓝桥杯 单片机设计与开发项目 省赛 输入&#xff1a; 频率信号输入模拟电压输入 输出&#xff08;包含各种显示功能&#xff09;&#xff1a; LED显示SEG显示DAC输出 01 数码管显示问题&#xff1a;数据类型 bit Seg_Disp_Mode;//0-频率显示界面 1-电压显示界面 un…

OpenHarmony南向开发案例:【智能垃圾桶】

样例简介 智能垃圾桶可以通过数字管家应用来监测垃圾桶当前可用容量&#xff0c;提醒主人及时处理垃圾&#xff1b;通过日程管家可以实现和其他智能设备联动。 核心组件位置功能距离传感器置于垃圾桶盖内侧感应垃圾量红外传感器置于垃圾桶前端感应是否有人靠近光敏电阻开发板…

【数据结构】第三节:单链表

前言 本篇要求掌握的C语言基础知识&#xff1a;指针、结构体 目录 前言 单链表 概念 对比链表和顺序表 创建链表 实现单链表 准备工作 打印链表 创建节点并初始化 尾插 二级指针的调用 尾插代码 头插 尾删 头删 查找&#xff08;返回节点&#xff09; 在指定位…

Java相关的定时任务

就现在而言&#xff0c;关于定时任务有各种各样的架构&#xff1a;java 定时器类【Timer】&#xff0c;spring定时器类【Scheduled】&#xff0c;quartz分布式定时器类&#xff0c;xxl-job分布式任务调度平台。xxl-job是一款轻量级定时任务可以分布式部署的调度平台。很多大的公…