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

一、node.js服务器动态资源处理与静态资源处理的区别?

静态与动态服务器主要区别于是否读取数据库,若然在数据库中的资料处理中将数据转换成可取用格式的结构,也就是说把对象转化为可传输的字节序列过程称为序列化,反之则为反序列化。

简单来说,它比起静态资源较复杂,因为它会随用户不同、响应内容不同而不断产生变化

二、什么是动态资源处理?

以JSON与JS为例,JSON.stringify()对数据序列化,JSON.parse()对数据反序列化。动态处理也就是对数据进行重新排序来读写数据库,读取反序列化,写入序列化。

三、处理动态资源的方法?

将页面内容动态化。使用到第三方模块——>模板引擎  去动态将我的数据嵌入到我的网页中去。

什么是模板引擎?见 http://t.csdnimg.cn/lzedW

四、代码示例。

(1)我们将首页、登录、注册三个html静态页面和用户列表users.html写在views这个大文件夹下。css样式和images图片放入public这个大文件夹下。创建一个data大文件夹,data下面建一个user.json文件来专门存储用户数据
简单写一下首页、注册、登录页面的html静态页面的样式。此处省略。具体见我上篇博客见 http://t.csdnimg.cn/zXWW7

动态资源处理具体表现就是我的用户列表渲染功能(users.html)和我的不同错误提示功能(404.html)。

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

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><ul><!-- 循环li --><% for(let username in users){ %><li><!-- 取出属性名和密码这个属性值,放入li里面 --><%=username %> : <%=users[username] %></li><% } %></ul>
</body>
</html>

404.html  不同错误提示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>404</title>
</head>
<style>body {background-color:pink;}
</style>
<body><h1><!-- 定义模板 --><%= msg %></h1>
</body>
</html>

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

(3) 测试代码如下:

const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
// 声明一个专门存放所有用户的变量
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) {users = {};} else {users = JSON.parse(data.toString()); //如果读取正确就将读到的内容转换为一个对象存到users里}
})
//服务器做出请求响应
server.on('request', (req, res) => {let objurl = url.parse(req.url); //将url转为一个对象才能获取到它的pathnamelet pathname = objurl.pathname;// 对pathname做处理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 == '/doRegist') {// Node.js 的 querystring 模块用于解析和格式化 URL 查询字符串:// 1. 将字符串参数解析成对象// querystring.parse(url)// 2. 将对象参数解析成字符串// querystring.stringify(urlObject)let query = querystring.parse(objurl.query);let username = query.username;let password = query.password;if (users[username]) {res.end(render({msg:'用户名已存在,不能注册!'}));} else {//因为users里面是一个对象。所以只能属性名=值的形式。故属性名 = 密码(密码相当于这个属性名对应的属性值)users[username] = password;//利用JSON.stringify(users)将users对象转为字符串重新写到文件里去fs.writeFile(path.join(__dirname, 'data/users.json'), JSON.stringify(users), (err) => {if (err) {res.end(render({msg:'注册失败'}));} else {res.end(render({msg:'注册成功'}));}})}} 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(render({msg:'登录成功'}));} else {res.writeHead(502, { 'Content-Type': 'text/html;charset=utf-8' });res.end(render({msg:'用户名或密码错误,登录失败'}));}} 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)结果显示

4-1》当我的用户数据已被注册时:

动态显示我的404.html页面

4-2》我完成用户注册时,我点击用户列表,显示结果如下:

(5)综上所述,相比我的静态资源处理而言,我的动态资源处理就相对效率较高,对于不同的错误信息,我可以直接使用我的404.html模板,直接在我的运行代码中显示 res.end(render({msg:'错误内容'})); 并且我可以直接使用用户数据模板user.html使用<% %> 执行javascript代码。可以直接在我的服务器端页面展示我的所有成功注册的用户数据。化繁为简。

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

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

相关文章

密码学 | 椭圆曲线密码学 ECC 入门(一)

目录 正文 1 公共密钥密码学的兴起 2 玩具版 RSA 算法 2.1 RSA 基本原理 2.2 RSA 举例说明 1 加密 2 解密 3 不是完美的陷门函数 ⚠️ 原文地址&#xff1a;A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面&#xff1…

RocketMQ:Windows下开发环境搭建

一、准备工作 从RockitMQ官网下载 | RocketMQ下载最新的release包。我这里下载的版本是v5.2.0 解压到本地目录&#xff0c;bin目录下存放可运行的脚本。 二、RocketMQ基本结构 在动手开发之前&#xff0c;我们需要了解一下RocketMQ的基本结构 如上图所示&#xff0c;一个正常…

终于把所有的Python库,都整理出来啦!

前排推荐下我自己花了一年时间整理的三本在线文档&#xff0c;适用于每一个 Python 工程师。 第一本&#xff1a; PyCharm 中文指南 2.0 第二本&#xff1a; Python黑魔法手册 - Python黑魔法手册 2.0 第三本&#xff1a; Python中文指南 - Python中文指南 以下是下文&a…

ABAP - 三代增强 BADI

SAP ERP提供了大量的标准功能&#xff0c;但是用户的需求是多种多样的&#xff0c;如何使SAP的标准功能适应用户的需求就变得非常重要&#xff0c;SAP Enhancement技术允许我们对SAP的标准功能进行扩展&#xff0c;以满足用户的个性化需求&#xff1b;SAP保证所有的BADI向上兼容…

UE5 HLSL 详细学习笔记

这里的POSITION是变量Position的语义&#xff0c;告诉寄存器&#xff0c;此变量的保存位置&#xff0c;通常语义用于着色器的输入和输出&#xff0c;以冒号“&#xff1a;”的方式进一步说明此变量&#xff0c;COLOR也类似 还有什么语义呢&#xff1f; HLSL核心函数&#xff1a…

web 学习第六次课程

文章目录 定位 定位 <body><div style"height:100px;width:100px;border:#F00 1px solid;"></div><div style"height:100px;width:100px;border: #00F 1px solid;"></div> </body><body><div style"pos…

【模拟】Leetcode 外观数列

题目讲解 38. 外观数列 算法讲解 我们可以看到将相同的划分为一组&#xff0c;使用双指针然后遍历区间 class Solution { public:string countAndSay(int n) {string ret "1";while(--n){string temp;int left 0, right 0;//相同的归为一组for(; right < …

Java中使用JTS对空间几何计算(距离、点在面内、长度、面积、相交等)模拟的大概写法

场景 基于GIS相关的集成系统&#xff0c;需要对空间数据做一些判断处理。比如读取WKT数据、点到点、点到线、点到面的距离&#xff0c; 线的长度、面的面积、点是否在面内等处理。 JTS (Java Topology Suite) Java拓扑套件&#xff0c;是Java的处理地理数据的API。 github地址&…

华为ensp中aaa(3a)实现telnet远程连接认证配置命令

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月14日18点49分 AAA认证的全称是Authentication、Authorization、Accounting&#xff0c;中文意思是认证、授权、计费。 以下是详细解释 认证&#xff08;Authentic…

查看TensorFlow已训模型的结构和网络参数

文章目录 概要流程 概要 通过以下实例&#xff0c;你将学会如何查看神经网络结构并打印出训练参数。 流程 准备一个简易的二分类数据集&#xff0c;并编写一个单层的神经网络 train_data np.array([[1, 2, 3, 4, 5], [7, 7, 2, 4, 10], [1, 9, 3, 6, 5], [6, 7, 8, 9, 10]]…

ActiveMQ 07 集群配置

Active MQ 07 集群配置 官方文档 http://activemq.apache.org/clustering 主备集群 http://activemq.apache.org/masterslave.html Master Slave TypeRequirementsProsConsShared File System Master SlaveA shared file system such as a SANRun as many slaves as requ…

代理知识科普:为什么有的代理IP速度比较慢呢?

代理IP在跨境业务中被广泛的应用&#xff0c;今天我们将一同深入探讨一个问题&#xff1a;“为什么有的IP代理速度比较慢&#xff1f;”随着数字化时代的不断发展&#xff0c;代理服务成为了许多网络操作的关键环节。然而&#xff0c;有时我们可能会遇到IP代理速度慢的问题&…

在Windows 10中打开高级系统属性的几种方法,总有一种适合你

序言 高级系统属性允许你配置许多内容&#xff0c;从性能到用户配置文件&#xff0c;从启动到环境变量。虽然这些设置不一定需要更改&#xff0c;并且只有在他们对自己正在做的事情有很好的了解时才应该执行&#xff0c;但了解它们肯定会帮助你在需要时调节 Windows。 什么是…

pycharm 更换Eclipse 的按键模式 keymap

流程 整体来说比较简单&#xff0c;其实只要下载一个eclipse keymap插件就可以完成 首先 ctrl alt s 打开设置页面&#xff0c;找到 plugin 安装完成后还是在 settings 下切换到 keymap即可以看到eclipse 的按键设置出现了&#xff0c;应用后ok 即可完成 再去试试&#x…

2024最新在线工具箱网站系统源码

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 2024最新在线工具箱网站系统源码是一…

Semaphore信号量源码解读与使用

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. 什么是Semaphore&#xff1f; 3. Semaphore源码解读 3.1 acquire…

如何安装flash-attn

flash-attn库安装记录_flash_attn-CSDN博客文章浏览阅读2.2k次&#xff0c;点赞11次&#xff0c;收藏14次。flash-attn库安装记录。安装好cuda11.7。让库找到cuda路径。_flash_attnhttps://blog.csdn.net/liaoqingjian/article/details/135624375?ops_request_misc%257B%2522r…

面试官:一个Java对象占用多大内存?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

Ubuntu上安装Chrome浏览器

安装步骤 1.下载安装chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb2.安装Chrome浏览器 sudo dpkg -i google-chrome-stable_current_amd64.debsudo apt-get -f install3.启动Chrome浏览器 查看收藏夹里的Chrome图标 单击C…

OpenHarmony实战开发-NAPI封装ArkTS接口案例。

介绍 部分应用的主要开发语言为C/C&#xff0c;但是HarmonyOS的部分接口仅以ArkTS的形式暴露&#xff0c;因此需要将ArkTS的接口封装为Native接口。本例以DocumentViewPicker的Select方法为例&#xff0c;提供了Napi封装ArkTS API的通用方法&#xff0c;本例包含内容如下&…