Node.js留言板(超详细注释)

目录结构如下

app.js

// 一.引入模块
var http = require('http');// 用于创建 HTTP 服务器和处理 HTTP 请求
var fs = require('fs');// 用于读取和写入文件
var url = require('url');// 用于解析URL// 创建留言数据对象
var msgs = [{ name: '牛二', content: "我是妞儿", create_at: '2024-1-04 06:12' },{ name: '张三', content: "我是张三", create_at: '2024-1-22 09:32' },{ name: '里斯', content: "我是里斯", create_at: '2024-2-23 12:28' },{ name: '王五', content: "我是王五", create_at: '2024-4-14 17:11' }
];// 二.创建 HTTP 服务器实例
var server = http.createServer();// 三.监听用户请求
server.on('request', function (req, res) {// 获取当前请求地址var currentUrl = req.url;//判断页面if (currentUrl == '/') {// 首页(fs模块)fs.readFile('./views/index.html', 'utf8', function (err, data) {if (err) {console.log(err);return;}// res.end(data);// data 是首页所有的 html 代码// 1.将上面的变量数据组装到htmlvar html = '';msgs.forEach(function (item, index) {html += `<li class="list-group-item" style="display: flex; justify-content: space-between; align-items: center;">${item.name}: ${item.content}<span >${item.create_at}</span><button class="btn btn-danger btn-sm" onclick="deleteMessage(${index})">删除</button></li>`;});// console.log(html);// 2.重点!!替换 data 的占位符var htmlData = data.replace('^_^', html);// 3.响应替换后的数据res.end(htmlData);// 结束响应,并向客户端发送最终的响应内容})} else if (currentUrl == '/add') {// 添加页fs.readFile('./views/add.html', 'utf8', function (err, data) {if (err) {console.log(err);return;}res.end(data);})} else if (currentUrl.indexOf('/doadd') === 0) {// get 提交 /doadd?name=xxx&content=xxx req.url 请求路径需用url模块var parsedUrl = new URL(req.url, 'http://localhost:8080');// 创建新的 URL 对象,解析 req.url 来获取客户端请求的 URL,如 /add// 'ht...80' 是基础 URL,用于解析相对 URL,从而得到完整的 URL 地址var paramsObj = parsedUrl.searchParams;// 从解析后的 URL 对象中获取查询参数// 格式化日期时间var date = new Date();var hours = date.getHours();var minutes = date.getMinutes();var hoursStr = (hours < 10 ? '0' : '') + hours;var minutesStr = (minutes < 10 ? '0' : '') + minutes;var dateStr = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + hoursStr + ':' + minutesStr;var msg = {name: paramsObj.get('name'),content: paramsObj.get('content'),create_at: dateStr};// 理论上是给数据库添加一条数据,现在是向数组中压入一条数据msgs.push(msg); // 添加留言对象到留言数组中// 插入成功,重定向到首页res.statusCode = 302; // 声明重定向res.setHeader('location', '/'); //设置响应头,指定重定向到网站的根目录res.end() // 结束响应,并将其发送给客户端} else if (currentUrl.startsWith('/delete')) { // 当前请求的 URL 以 '/delete' 开头// 解析并删除对应索引var index = parseInt(currentUrl.split('/').pop());msgs.splice(index, 1);// 删除成功,重定向到首页res.statusCode = 302;res.setHeader('location', '/');res.end();}else {// 404fs.readFile('./views/404.html', 'utf8', function (err, data) {if (err) {console.log(err);return;}res.end(data);})}
})// 四.启动服务
server.listen(8080, function () {console.log('启动成功,访问:http://localhost:8080')
})// 注意
// 终端需要cd转到当前message目录下,再node app.js// currentUrl.indexOf('/doadd') === 0
// 通过 indexOf() 方法检查当前请求的 URL 是否以 /doadd 开头
// 如果返回 0,则表示当前 URL 的开头与 /doadd 完全匹配
// 如果匹配成功,条件语句将返回 true,否则返回 false

index.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>留言板</title><!-- 引入 Bootstrap 样式表 --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head><body><!-- 头部容器 --><div class="header container"><!-- 页面标题栏 --><div class="page-header"><h1>留言板</h1><a class="btn btn-success" href="/add">发表留言</a><!-- 创建按钮链接到“/add”页,设置 Bootstrap 中的成功按钮 --></div></div><!-- 留言容器 --><div class="comments container"><ul class="list-group">^_^<!-- 占位符,表示在这里显示留言列表 --></ul></div><script>function deleteMessage(index) {if (confirm("确定要删除这条留言吗?")) {fetch(`/delete/${index}`, { method: 'DELETE' }).then(response => {if (response.ok) {window.location.reload(); // 删除成功后刷新页面} else {console.error('删除留言失败');}}).catch(error => {console.error('删除留言失败', error);});}}// 接受一个要删除的留言的索引参数 `index`// 函数首先弹出确认对话框,询问用户是否确定要删除该留言。// 如果确认,则通过 `fetch` 函数向服务器发送一个 DELETE 请求,// 该请求的路径包含了要删除的留言的索引。// 删除成功(即响应状态码为 200 OK),则刷新页面,以展示更新后的留言列表;// 删除失败,在控制台输出错误信息。</script></body></html>

add.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>发表留言</title><!-- 将 Bootstrap 的 CSS 文件引入到 HTML 页面中 --><link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"></head><body><!-- 头部容器 --><div class="header container"><!-- 页面标题栏 --><div class="page-header"><h1><a href="/">首页</a> <small>发表留言</small></h1></div></div><!-- 评论容器 --><div class="comments container"><!-- 创建表单,GET 提交到“/doadd”页 --><form action="/doadd" method="get"><div class="form-group"><label for="input_name">昵称</label><!-- 昵称输入框,设置类型为“name”,输入内容的最小和最大长度 --><input type="name" class="form-control" id="input_name" placeholder="请输入姓名" minlength="2" maxlength="10"name="name"></div><div class="form-group"><label for="input_message">留言内容</label><!-- 留言内容输入框,设置宽度30,高度10,必填,输入内容的最小和最大长度 --><textarea class="form-control" name="content" cols="30" rows="10" required minlength="5"maxlength="20"></textarea></div><!-- 提交按钮 --><button type="submit" class="btn btn-default">发表</button></form></div>
</body></html>

404.html

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>404</title>
</head><body><h1 style="text-align: center;">404!!!!</h1>
</body></html>

演示图片

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

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

相关文章

场景:数据库死锁

来自hollis八股文 流程图 前置知识 数据库上锁锁住的不是行&#xff0c;而是索引的主键 比如我对id 1的主键进行上锁&#xff0c;实际上是对查询使用的主键的key 1 进行上锁 对非聚簇索引操作时&#xff0c;首先会对非聚簇索引上锁&#xff0c;然后在请求主键的锁 比如我…

为什么开关电源变压器的耦合不可能为100%?什么是漏感?

一、为什么开关电源变压器的耦合不可能为100%&#xff1f; 变压器耦合度是指变压器初级绕组和次级绕组之间能量传递的效率&#xff0c;它反映了变压器在电磁感应过程中&#xff0c;初级侧磁通量能够有多少比例被次级侧有效利用。理论上&#xff0c;理想的变压器耦合度应该是10…

08 Php学习:if语句、Switch语句

PHP 条件语句 当您编写代码时&#xff0c;您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。 在 PHP 中&#xff0c;提供了下列条件语句&#xff1a; if 语句 - 在条件成立时执行代码 if…else 语句 - 在条件成立时执行一块代码&#xff0c;…

Java实现短信发送并校验,华为云短信配合Redis实现发送与校验

Java实现短信发送并校验&#xff0c;华为云短信配合Redis实现发送与校验 安装sms4j和redis <dependency><groupId>org.dromara.sms4j</groupId><artifactId>sms4j-spring-boot-starter</artifactId><version>3.2.1</version> <…

WPS基础使用

个人笔记&#xff08;整理不易&#xff0c;有帮助&#xff0c;收藏点赞评论&#xff0c;爱你们&#xff01;&#xff01;&#xff01;你的支持是我写作的动力&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔…

单路高清HDMI编码器JR-3211HD

产品简介&#xff1a; JR-3211HD单路高清HDMI编码器是专业的高清音视频编码产品&#xff0c;该产品具有支持1路高清HDMI音视频采集功能&#xff0c; 1路3.5MM独立外接音频输入&#xff0c;编码输出双码流H.264格式&#xff0c;音频MP3/AAC格式。编码码率可调&#xff0c;画面质…

SHARE 203S PRO:倾斜摄影相机在地灾救援中的应用

在地质灾害的紧急关头&#xff0c;救援队伍面临的首要任务是迅速而准确地掌握灾区的地理信息。这时&#xff0c;倾斜摄影相机成为了救援测绘的利器。SHARE 203S PRO&#xff0c;这款由深圳赛尔智控科技有限公司研发的五镜头倾斜摄影相机&#xff0c;以其卓越的性能和功能&#…

QtCreater 使用

QtCreater 创建项目 1.刚进入 QtCreater 的界面是这样的一个界面 ① 创建一个新的文件&#xff0c;那么我们就选择左上角的 “文件” ② 点击新建文件&#xff0c;或者也可以直接使用快捷键 CtrlN 此时就会弹出对话框&#xff0c;让我们选择想要创建的文件&#xff1a; Appli…

python爬虫-----爬虫解析—xpath(第十八天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

Nginx日志格式化和追踪

背景 Nginx是一款功能强大的Web服务器&#xff0c;对于网络环境中的日志记录和配置至关重要。定制化Nginx日志格式可以帮助管理员更好地监控服务器性能、分析用户行为并做出相应优化。在本文中&#xff0c;我们将深入探讨Nginx日志格式的高级定制化策略&#xff0c;包括理解基…

API接口京东开放平台item_get-获得京东商品详情API接口根据商品ID查询商品标题价格描述等详情数据

京东商品详情API接口可以提供以下方面的信息&#xff1a; 商品基础信息&#xff1a;包括商品的标题、价格、描述、图片等基本信息&#xff0c;这是构建电商平台的基础数据。商品分类信息&#xff1a;帮助用户更好地了解商品所属的类别&#xff0c;便于商品筛选和查找。商品销售…

sheng的学习笔记-AI-决策树(Decision Tree)

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是决策树 划分选择 信息增益 增益率 基尼指数 剪枝处理 预剪枝 后剪枝 连续值处理 另一个例子 基本步骤 排序 计算候选划分点集合 评估分割点 每个分割点都进行评估&#xff0c;找到最大信息增益的…

DB schema表中使用全局变量及在DB组件中查询

DB schema表中使用全局变量及在DB组件中查询 规则如下&#xff1a; 使用如下&#xff1a; 如果在unicloud-db组件上不加判断条件&#xff0c;就会报错&#xff0c;并进入到登录页。 那么就会进入到登录页&#xff0c;加上了判断条件&#xff0c;有数据了就不会了。 因为在sc…

电脑录屏软件哪个好用又免费?市面20款录屏软件测评结果

随着在线教学、远程办公和自媒体创作的兴起&#xff0c;电脑录屏软件逐渐成为了许多用户的必备工具。市面上的录屏软件琳琅满目&#xff0c;但真正既好用又免费的却并不多见。为了帮助大家找到心仪的录屏软件&#xff0c;我们对市面上20款热门免费录屏软件进行了详细的测评。 电…

一起学习python——基础篇(20)

前言&#xff0c;之前经常从网上找一些免费的接口来测试&#xff0c;有点受制于人的感觉。想了想还不如直接写一个接口&#xff0c;这样方便自己测试。自己想返回什么格式就返回什么样子&#xff0c;不用担心服务报错&#xff0c;因为自己就可以完全掌控。然后宿舍二哥告诉我py…

OpenHarmony C/C++三方库移植适配

简介 众所周知&#xff0c;C/C三方库相对与JS/ETS的三方组件来说&#xff0c;其运行效率高。那如何将一个C/C三方库移植到OH系统上呢&#xff1f;本文将介绍如何快速高效的移植一个C/C三方库到OpenHarmony上。 C/C三方库适配问题与解决方案 由上图可以看出&#xff0c;三方库…

回溯算法初识

文章目录 回溯算法初识什么是回溯算法回溯算法的步骤回溯算模版例题 回溯算法初识 什么是回溯算法 ​ 回溯算法是一种通过不断尝试可能的解决方案来解决问题的算法。它通常用于解决组合优化问题&#xff0c;如排列组合问题、子集和问题等。该算法通过尝试所有可能的候选解&am…

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解 目录 时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解&#xff08;完整源码和数据) 1.利用鲸…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

建模设计软件 Archicad 27 for mac激活版

在建筑设计领域&#xff0c;每一次技术的革新都意味着设计效率和质量的飞跃。Archicad 27 for Mac&#xff0c;就是这样一款引领行业变革的设计软件。 Archicad 27凭借出色的性能优化和强大的功能更新&#xff0c;为Mac用户带来了前所未有的建筑设计体验。它支持BIM&#xff08…