node.js如何实现留言板功能?

news2024/11/15 12:11:12

一、实现效果如下:

20240422_160404

二、前提配置:

配置:需要安装并且导入underscore模板引擎

安装:在控制台输入npm install underscore -save

文件目录配置:

1》在文件里建一个data文件夹,此文件夹下建一个conmments.json文件,专门用来存放留言数据

2》将页面的css样式全写入public文件夹下的bootstrap下的bootstrap.css文件下

3》建一个view文件夹专门用来存放我的静态html页面。此案例中我有一个index.html留言展示主页和post.html发表留言表单页

4》我将运行代码写在app.js里

三、代码实现:

3-1》知识补充

get请求处理方法有:

(1)querystring.parse(req.url.query)

(2)url.parse(req.url,true)  第二个参数true,直接将查询字符串转化为了对象

3-2》index.html首页代码如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>首页</title>
    <link rel="stylesheet" href="../public/bootstrap/bootstrap.css">
</head>

<body>
    <div class="header container">
        <div class="header">
            <h1>留言本<small>谢谢你的留言</small></h1>
            <a href="/post" class="btn">发表留言</a>
        </div>
        <hr>
    </div>

    <div class="middle-container">
        <ul class="middle-ul">
            <% for(item of comments){ %>
                <li>
                    <%= item.name%>说:<%= item.message%>
                            <span class="floatright">
                                <%= item.dataTime%>
                            </span>
                </li>
                <% } %>
        </ul>
    </div>
</body>

</html>

post.html 发表留言表单如下: 

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>留言页</title>
</head>

<body>
    <div class="header container">
        <div class="header">
            <h1><a href="/">留言</a><small>发表评论</small></h1>
        </div>
        <hr>
    </div>
    <div>
        <form action="/a" method="get">
        <!-- action提交的路径、method提交的方法 -->
        <p style="font-size: large;">你的大名</p>
        <input type="text" name="name">
        <p style="font-size: large;">留言内容</p>
        <textarea name="message" id="" cols="30" rows="10">
</textarea>
        <br>
        <button type="submit">发表</button>
    </form>
    </div>
</body>

</html>

3-4》data下的comment.json储存数据页如图:

{
    "comments": [
        {
            "name": "555",
            "message": "5555",
            "dataTime": "2024/4/22 16:04:15"
        },
        {
            "name": "小一",
            "message": "我是小一",
            "dataTime": "2024/4/19 15:54:43"
        },
        {
            "name": "小米",
            "message": "我爱node",
            "dataTime": "2024/4/16 下午9:11:32"
        }
      ]
}

3-5》app.js运行代码如下:

//一、引入http、fs、path、url内置模块
const http = require('http');
const fs = require('fs');
const path = require('path');
const url = require('url');
//二、导入underscore渲染模板
const _ = require('underscore');
//三、声明一个变量comments,用来存放留言数据
var comments;
//四、异步读取文件,读取user.json存放用户数据的文件
fs.readFile(path.join(__dirname, 'data/comments.json'), (err, data) => {
    if (err) {//错误处理
        comments = {};
    } else {//如果读取正确就将读到的内容转换为一个对象存到comments里
        comments = JSON.parse(data.toString());
    }
})
//五、创建服务器
const server = http.createServer();
//六、服务器做出请求响应
server.on('request', (req, res) => {
    let urls = url.parse(req.url, true);  //解析get请求法二:第二个参数true,直接将查询字符串转为对象
    let pathname = urls.pathname;
//七、利用if分支对不同的pathname做不同处理
    if (pathname == '/') { //展示留言首页 index.html
        fs.readFile(path.join(__dirname, 'view/index.html'), (err, data) => {
            if (err) { //错误处理
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('访问的资源不存在')
            } else {
                //使用underscore渲染模板
                let complied = _.template(data.toString());
                let html = complied(comments);
                res.end(html);
            }
        })
        //请求静态资源进行处理 此处就是我的图片资源  startsWith方法,以什么开头
    } else if (pathname.startsWith('/public')) {
        fs.readFile(path.join(__dirname, pathname), (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('访问的资源不存在')
            } else {
                // 资源存在则写入json文件
                fs.writeFile(path.join(__dirname, 'data/comments.json'), JSON.stringify(comments), (err) => {
                    if (err) {
                        res.end('写入失败');
                    } else {
                        res.end(data);
                    }
                })
            }
        })
//八、对post.html表单的留言进行读取和处理
        //点击发表留言按钮进入发表留言页面。发表留言按钮的href为/post
    } else if (pathname == '/post') { //读取留言
        fs.readFile(path.join(__dirname, 'view/post.html'), (err, data) => {
            if (err) {
                res.writeHead(404, { 'Content-Type': 'text/html;charset=utf-8' });
                res.end('访问的资源不存在')
            } else {
                res.end(data);
            }
        })
        //form表单的action为'/a'
    } else if (pathname == '/a') { //处理留言
       //将url查询字符串解析结果urls.query赋值给自定义变量postcomments
        var postcomments = urls.query; 
        var data = new Date();
        // 调用Date对象的toLocaleString方法,将当前的日期和时间转换为一个本地化的字符串格式,并将其赋给变量now。
        var now = data.toLocaleString();
        // 给postcomments添加dataTime属性,并且将now变量的值添加到postcomments对象中
        postcomments.dataTime = now;
        // 将一个名为comments的对象中的comments数组的第一个位置插入postcomments对象。
        comments.comments.unshift(postcomments);
        // 重新发送请求
        // 状态码设置为302,临时重定向
        res.statusCode = 302;
        // 设置HTTP响应头中的Location字段为/,表示服务器希望浏览器重定向到网站的根URL。
        res.setHeader('Location', '/')
        res.end()

    }
});
//九、启动监听
server.listen(3000, '127.0.0.1', () => {
    console.log('http://127.0.0.1:3000');
})

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

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

相关文章

SLS 查询新范式:使用 SPL 对日志进行交互式探索

作者&#xff1a;无哲 引言 在构建现代数据和业务系统的过程中&#xff0c;可观测性已经变得至关重要&#xff0c;日志服务&#xff08;SLS&#xff09;为 Log/Trace/Metric 数据提供了大规模、低成本、高性能的一站式平台服务&#xff0c;并提供数据采集、加工、投递、分析、…

【PhpStorm的环境配置与应用的简单介绍】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

AWD线下攻防万字最完整战术(记第一届“长城杯”半决赛战术)

目录 准备阶段 1.登录比赛平台&#xff08;获取资产&#xff09; 查看账号账号修改 服务器SSH口令mysqlWEB服务口令(后台密码)数据库后台管理员密码 账号用户检查 2.dump源码&#xff08;方便应急响应恢复靶机&#xff09; 网站源码备份 压缩文件解压文件备份到服务器本地上传…

探索大型语言模型(LLM)在人类性格个性评估(MBTI)中的前景与应用

1.概述 大型语言模型&#xff08;LLM&#xff09;如ChatGPT在各个领域的应用确实越来越广泛&#xff0c;它们利用庞大的数据集进行训练&#xff0c;以模拟人类的语言理解和生成能力。这些模型在提供信息、解答问题、辅助决策等方面表现出了强大的能力&#xff0c;但它们并不具…

Docker pull镜像名称 把本地镜像推送到远程详解

Docker pull镜像名称 把本地镜像推送到远程详解&#xff1a; Docker 镜像 仓库 容器介绍 以及镜像仓库详解 下载一个alpine的镜像演示&#xff0c;alpine是一个比较小的的linux镜像。 docker pull alpinedocker tag d4ff818577bc docker.io/itying/alpine:v1.0.1docker tag d4…

Macs Fan Control Pro for Mac:全面优化Mac风扇控制软件

Macs Fan Control Pro for Mac是一款专为苹果电脑用户设计的风扇控制软件&#xff0c;旨在通过精确的风扇速度调节&#xff0c;全面优化Mac的散热性能&#xff0c;确保系统始终运行在最佳状态。 Macs Fan Control Pro for Mac中文版下载 该软件具备实时监控功能&#xff0c;能够…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互&#xff0c;包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡&#xff0c;向“/test.txt”写入“myfirstmessage”&#xff0c;读取并打印其内容。loop函数留空待扩展。 1. 需要…

区块链安全应用-------压力测试

基于已有的链进行测试&#xff08;build_chain默认建的链 四个节 点&#xff09;&#xff1a; 第一步&#xff1a;搭链 1. 安装依赖 在ubuntu操作系统中&#xff0c;操作步骤如下&#xff1a; sudo apt install -y openssl curl 2. 创建操作目录, 下载安装脚本 ## 创建操作…

HDFS分布式文件存储系统

1-1 HDFS的存储机制 按块&#xff08;block&#xff09;存储 hdfs在对文件数据进行存储时&#xff0c;默认是按照128M(包含)大小进行文件数据拆分&#xff0c;将不同拆分的块数据存储在不同datanode服务器上 拆分后的块数据会被分别存储在不同的服务器上 副本机制 为了保证hdfs…

标题Selenium IDE 常见错误笔记

Selenium IDE 常见错误笔记 错误1&#xff1a;Failed:Exceeded waiting time for new window to appear 2000ms 这个错误通常出现在第一次运行时&#xff0c;有两个原因&#xff1a; Firefox阻止了弹出式窗口&#xff0c;在浏览器设置里允许这个操作即可。 有些网站设置了反…

轻松上手,无缝对接:详述如何接入企讯通空号检测接口API

企讯通空号检测接口API作为一款高效、精准的手机号码状态检测工具&#xff0c;能够帮助企业及开发者快速识别手机号码的有效性&#xff0c;优化通讯资源&#xff0c;提升营销效果。本篇文章将带领您一步步了解如何轻松、无缝地对接企讯通空号检测接口API&#xff0c;让您的业务…

HIVE无法启动问题

​ 启动不了hive 一直在加载中&#xff01; 问题&#xff1a;当我们打开电脑 想要学习hive时 我们却发现 它一直卡在启动页面 true一直后没有信息或者报错 原因&#xff1a;我们在之前学习时 在配置hdfs的高可用时&#xff08;High Availability 简称HA&#xff09; 高可用…

stm32HAL_GPIO输入

学会使用 GPIO 采集 KEY 的数据信息&#xff0c;这种信息采集技术在生活中常见于对大自 然环境的各种信息的采集。比如环境温度&#xff0c;湿度等等。我们这里以 key 为入门设 备。 一&#xff0c;什么是信息采集 比如环境温度&#xff0c;湿度等等。我们需要把这些温度&am…

Spire.PDF for .NET【文档操作】演示:更改 PDF 版本

在某些平台上上传或提交 PDF 文件时&#xff0c;您有时会面临平台需要特定版本的 PDF 文件的困境。如果您的PDF文件无法满足要求&#xff0c;则需要将其转换为不同版本以实现兼容性。本文将演示如何使用Spire.PDF for .NET以编程方式在不同版本之间转换 PDF。 Spire.PDF for .…

探秘数据库中间件:ProxySQL与MaxScale的优势与劣势

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 探秘数据库中间件&#xff1a;ProxySQL与MaxScale的优势与劣势 前言功能对比负载均衡故障转移查询路由使用场景和业务需求下的选择建议 性能对比响应速度并发连接数不同负载条件下的性能表现 高可用性…

R语言绘制动态网络图Network教程WGCNA

今天分享的笔记是使用NetworkD3对WGCNA的共表达网络进行可视化&#xff0c;创建交互式动态网络图&#xff0c;展示基因之间的相互关系&#xff0c;可以用于转录组或者其他调控网络展示。 加权基因共表达网络分析 (WGCNA, Weighted correlation network analysis)是用来描述不同…

大语言模型(LLM)漏洞爆发,AI模型无一幸免

本文概述了人工智能初创公司Anthropic于2024年04月03日发表的一篇针对人工智能安全的论文&#xff0c;该公司在本论文中宣布的一种新的“越狱”技术&#xff0c;名为Many-shot Jailbreaking&#xff08;多轮越狱&#xff09;。文章详细描述了目前大语言模型&#xff08;LLM&…

AI大模型探索之路-实战篇2:基于CVP架构-企业级知识库实战落地

目录 前言 一、概述 二、本地知识库需求分析 1. 知识库场景分析 2. 知识库应用特点 3. 知识库核心功能 三、本地知识库架构设计 1. RAG架构分析 2. 大模型方案选型 3. 应用技术架构选型 4. 向量数据库选型 5. 模型选型 三、本地知识库RAG评估 四、本地知识库代码落地 1. 文件…

Godot3D学习笔记1——界面布局简介

创建完成项目之后可以看到如下界面&#xff1a; Godot引擎也是场景式编程&#xff0c;这里的一个场景相当于一个关卡。 这里我们点击左侧“3D场景”按钮创建一个3D场景&#xff0c;现在在中间的画面中会出现一个球。在左侧节点视图中选中“Node3D”&#xff0c;右键创建子节点…

day_8题解

利用最大公约数求最小公倍数 #include<iostream> using namespace std;int gcd(int a,int b) {return b?gcd(b,a%b):a; }int main() {long long a,b;cin>>a>>b;long long ansgcd(a,b);cout<<(a*b)/ans<<endl;return 0; }排序遍历&#xff0c;记…