❤Node实现接口增删改查(文章为例)

news2024/11/20 19:30:57

❤Node实现接口增删改查(文章为例)

1、文章表的创建​

接下来我们新建一个文章数据表article,实现对于文章部分的管理功能接口

根据文章我们创建一个对应的 SQL 数据表

javascript

CREATE TABLE articles (
    id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    author VARCHAR(255),
    articletype VARCHAR(50),
    articleclick INT,
    articlestatus INT,
    articlecollect INT,
    content TEXT,
    thumbnail TEXT,
    articlepublishTime DATETIME,
    author_id INT,
    created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

我们看到作者的信息需要我们登录用户进行登录以后才进行发布等操作,所以我们加一个外键进行约束

javascript

    updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (author_id) REFERENCES authors(id)

创建好之后的文章数据表是这样子的

实现文章管理功能其实跟我们实现用户管理的部分都差不多

文章管理功能主要是我们在pc端用户进行登陆以后可以对于文章进行增删改查,然后在后台管理之中可以对发布的文章进行归类

2、文章的搜索接口​

接下来我们就参照用户的列表查询部分同样的去开发一个文章的查询列表,在这里我们也可以先试试数据库查询的条件是否可以用

javascript

SELECT * FROM articles

查找我们的文章是没有问题的

接下来把查询数据库的部分放进去我们的接口里面,然后进行优化和接口的处理

javascript

// 分页查询文章
app.get('/api/articles', (req, res) => {
    console.log(req.query, 'req.query');
    console.log(req.body,'req.body');
    console.log(req.params,'req.params');
    const { title, articletype, pageNum, pageSize } = req.query;

    let query = `SELECT * FROM articles`;

    // 构建查询条件
    const params = [];

    // 标题
    if (title !== undefined && title !== '' && title !== null) {
        query += ' WHERE title = ?';
        params.push(title);
    }
    // 类型
    if (articletype !== undefined && articletype !== '' && articletype !== null) {
        query += params.length ? ' AND' : ' WHERE';
        query += ' articletype = ?';
        params.push(articletype);
    }

    if (pageNum !== undefined && pageSize !== '' && pageSize !== null) {
        query += ' LIMIT ?, ?';
        let offset = (pageNum - 1) * pageSize;
        params.push(offset);
        params.push(parseInt(pageSize));
    }

    
    console.log('文章查询条件', query, params);
    // 查询数据库并返回数据
    connectionpool.query(query, params, (err, results) => {
        // console.log(err,'err');
        // console.log(results,'results');

        if (err) {
            console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        } else {
            let sqltotal = `SELECT COUNT(*) AS total FROM articles;`
            // 查询数据库并返回数据
            connectionpool.query(sqltotal, (errtotal, rows) => {
                let total = rows[0]['total'];
                if (err) {
                    console.error('Error querying database:', err);
                    res.status(500).json({ error: 'Internal server error' });
                    return;
                } else {
                    res.json({
                        total: total,
                        code: '200',
                        data: results,
                    });
                }
            });
        }
    });
});

验证一下我们的查询接口 ,文章的查询没问题

3、文章增加接口​

接下来尝试一下我们的添加功能,我们先来做一个简单的文章标题以及作者,文章状态的增加

先来试试我们的数据库插入语言,看是否正确

javascript

INSERT INTO articles (title, author,articlestatus) VALUES ('title', 'author',1)

执行结束以后可以看出,我们的数据库之中的数据已经进行了相应的更改

接下来我们将数据库语言放入我们的语句之中

所以我们的新增接口就是:

javascript

// 新增  POST 
app.post('/api/articles', (req, res) => {
    // console.log(req.body);
    const { title, author } = req.body; // 从请求体中获取数据
    const values = [title, author];

    
    // 准备 SQL 插入语句
    const insertSql = `INSERT INTO articles (title, author,articlestatus) VALUES (?, ?,1)`;
    connectionpool.query(insertSql, values, (err, results) => {
        // console.log(err,'err');
        // console.log(results,'results');
        if (err) {
            console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: '200',
            data: results,
        });
    });
});

尝试一下我们的新增接口

增加功能ok,并且能正确返回我们想要的东西

4、文章详情接口​

文章详情用户通过文章的id然后查到对应文章的内容

接下来我们简单写一个文章的详情

javascript

// 获取详情 3
app.get('/api/articles/:id', (req, res) => {
    // console.log(req.query,'req.query');
    const { id } = req.params;
    const values = [id];
    let query = 'SELECT * FROM articles WHERE id = ?';
    connectionpool.query(query, values, (err, results) => {
        if (err) {
            console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: '200',
            data: results ? results[0] : {},
        });
    });
});

简单测试一下,详情接口没问题,这里详情我们采用的也是通过ID的方式进行获取的,还有另外一种方式就是当我们的列表存在数据的时候,我们可以直接利用列表的数据直接渲染到表单上,而不需要额外的去再次调用接口!

5、文章修改接口​

接下来我们完善一下我们的文章修改接口:

javascript

// 更新数据 PUT请求处理程序 
app.put('/api/articles', (req, res) => {
    // console.log(req.body);

    const { title, author, id } = req.body; // 从请求体中获取数据
    const values = [title, author, id];
    // 准备 SQL 插入语句
    const sql = "UPDATE user SET title = ?, author = ? WHERE id = ?";
    connectionpool.query(sql, values, (err, results) => {
        if (err) {
            console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: '200',
            data: results,
        });
    });
});

测试一下文章修改接口

发现这里我们爆了一个错误的信息,这个时候我们要学会看接口的错误问题,从信息来看,是我们的表调用错误,我们更正一下

javascript

const sql = "UPDATE user articles title = ?, author = ? WHERE id = ?";

再次调用

文章修改接口没问题

5、文章删除接口​

删除部分参照我们的用户部分进行更改

javascript



// 删除数据 DELETE请求处理程序  
app.delete('/api/articles/:id', (req, res) => {
    // const {id} = req.body; // 从请求体中获取数据
    const id = req.params.id;
  
    const values = [id];
    const sql = "DELETE FROM articles WHERE id = ?";
    connectionpool.query(sql, values, (err, results) => {
        if (err) {
            console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: '200',
            data: results,
            message:'删除成功!',
        });
    });
});

点击删除按钮测试一下我们的接口

测试可以发现,我们的删除功能已经好了!

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

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

相关文章

亚马逊卖家如何利用自养号测评策略低成本提升销量?

在跨境电商的平台上,随着市场逐渐成熟与竞争的白热化,众多卖家正面临流量增长乏力与转化率提升困难的双重挑战。为了在这日益激烈的竞争环境中脱颖而出,卖家们纷纷加大投入,探索多样化的推广策略,但往往因策略不够精准…

探索Kombo:AI与API的完美结合

文章目录 探索Kombo:AI与API的完美结合背景介绍库的定义安装指南简单函数使用场景应用常见问题及解决方案总结 探索Kombo:AI与API的完美结合 背景介绍 在当今快速发展的人工智能领域,Kombo库以其独特的优势脱颖而出。Kombo是一个专注于AI的…

2024年7月大众点评全国爱车前百名城市分析

在做一些城市分析、学术研究分析、商业选址、商业布局分析等数据分析挖掘时,大众点评的数据参考价值非常大,截至2024年7月,大众点评美食店铺剔除了暂停营业、停止营业后的最新数据情况分析如下。 分析研究的字段维度包括大众点评数字id、字母…

微信商城小程序怎么弄_重塑购物体验

在数字化浪潮的推动下,微信商城小程序正逐步成为消费者购物的新宠儿。它不仅打破了传统电商的界限,更以其便捷性、高效性和个性化服务,重新定义了购物体验。今天,让我们一同探索微信商城小程序如何以独特魅力,引领未来…

巴鲁夫rfid读头国产平替版——高频RFID读写器

随着RFID技术的不断发展,国内RFID企业的数量也在不断地变多,国产RFID读写器的质量也越来越高。具有着价格实惠、质量可靠等特点,成为了可平替国外RFID产品的首要选择。健永科技的高频RFID读写器JY-H830,是一款可平替巴鲁夫rfid读头…

完美解决Idea中如何对Java Agent进行断点调试的方式

1、前言 在日常开发中,可能会存在写一个Java Agent到项目中去,Agent的实现可能是复杂的,有时候会出现attach到进程上后,发现没效果,也不知道怎么调试,只能通过打日志的方式实现,效率实在是太低…

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指…

C++ bitset(位图)的模拟实现

文章目录 一、bitset接口总览二、bitset模拟实现1. 构造函数2. set、reset、flip、test3. size、count4. any、none、all5. 打印函数 三、完整代码 一、bitset接口总览 成员函数功能set设置指定位或所有位为1(即设置为“已设置”状态)reset清空指定位或…

华为eNSP:MAC地址安全

一、什么是MAC地址安全 MAC地址安全是一种网络安全措施,用于保护网络设备和通信免受未经授权的访问和潜在的安全威胁。以下是对MAC地址安全的详细介绍: MAC地址概述 定义:MAC地址(Media Access Control Address)是网络…

【绿豆蛙的归宿】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510; const int M 2e510; int h[N], e[M], ne[M], idx, w[M]; double p[M]; int cnt[N]; double E; int n, m; void add(int a, int b, int c) // 添加一条边a->b {p[idx] 1, w[idx] c, e…

STM32F1+HAL库+FreeTOTS学习14——数值信号量

STM32F1HAL库FreeTOTS学习13——数值信号量 1. 数值信号量2. 相关API函数2.1 创建计数信号量2.2 获取信号量2.3 释放信号量2.4 删除信号量2.5 获取信号量的计数值 3. 操作实验1. 实验内容2. 代码实现&#xff1a;运行结果 上一期我们学习了二值信号量 &#xff0c;这一期学习计…

锅圈食品业绩承压显著:门店减少255家,押注肴肴领鲜打入农贸市场?

《港湾商业观察》廖紫雯 日前&#xff0c;锅圈食品&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称&#xff1a;锅圈&#xff0c;02517.HK&#xff09;发布2024年上半年业绩运营情况。作为“在家吃饭第一股”&#xff0c;锅圈于2023年11月成功登陆港交所&#…

关于BSV区块链覆盖网络的常见问题解答(上篇)

​​发表时间&#xff1a;2024年9月20日 在BSV区块链上的覆盖网络服务为寻求可扩展、安全、高效交易处理解决方案的开发者和企业家开辟了新的视野。 作为开创性的曼达拉升级的一部分&#xff0c;覆盖网络服务提供了一个强大的框架&#xff0c;用于管理特定类型的交易和数据访问…

署名文章 | 对桂花AP2/ERFs的比较转录组分析揭示了OfERF017介导的有机酸代谢途径在花衰老中的作用

发表期刊&#xff1a;Frontiers in plant science 发表日期&#xff1a;2024年9月26日 影响因子&#xff1a;4.1 发表单位&#xff1a;湖北科技学院 研究背景 “玉露沾衣冷&#xff0c;金风拂面凉。桂花香满袖&#xff0c;秋色入诗囊。”桂花&#xff0c;中国十大名花之一…

Linux 网络配置 (深入理解)

前言 前期我比较迷惑Ubuntu 的网络配置。 我接触比较多的 Linux 发行版都是 Ubuntu &#xff0c;我按照网上的一些教程配置网络发现&#xff0c;没有相关网络配置文件夹。然后我发现不是我的问题而是不同版本的配置方式和工具是不一样的。然后有些配置已经弃用了。 常见的网络…

国庆节快乐|中国何以成为中国

华夏之土&#xff0c;广袤无垠&#xff1b;中华之史&#xff0c;源远流长。自古以来&#xff0c;中原大地物华天宝&#xff0c;人杰地灵&#xff0c;遂成一国&#xff0c;是谓中国。然中国之所以为中国&#xff0c;非徒地大物博、历史悠久也&#xff0c;更有其深厚之文化底蕴、…

实例讲解电动汽车冷却系统控制策略及Simulink建模方法

电动汽车的电机、电机控制器、DCDC、OBC在工作时都会大量发热&#xff0c;尤其是电机和电机控制器&#xff0c;功率大发热量大&#xff0c;且温度过高后会影响其正常功能&#xff0c;导致车辆故障无法正常行车&#xff0c;因此电动汽车冷却系统的控制也是一个非常重要的问题。本…

三维可视化技术的应用现状和发展前景

三维可视化技术的应用现状 工程建模 在工程领域&#xff0c;三维可视化技术被广泛应用于建筑设计、城市规划和工业制造等方面。通过三维建模软件&#xff0c;工程师可以创建逼真的模型&#xff0c;进行设计评估、碰撞检测和动态模拟&#xff0c;提高工程项目的效率与质量。 …

【傻呱呱】ESXI挂载USB移动硬盘给黑裙扩容

前期准备 ssh连接工具&#xff08;这里我用finalshell&#xff09; 删除移动硬盘分区&#xff08;此操作会删除硬盘内所有数据&#xff0c;注意备份&#xff01;&#xff01;&#xff01;&#xff09; 将需要挂载的usb移动硬盘连接到电脑上&#xff0c;使用分区工具&#xff…

1、Spring Boot 3.x 集成 Eureka Server/Client

一、前言 基于 Spring Boot 3.x 版本开发&#xff0c;因为 Spring Boot 3.x 暂时没有正式发布&#xff0c;所以很少有 Spring Boot 3.x 开发的项目&#xff0c;自己也很想了踩踩坑&#xff0c;看看 Spring Boot 3.x 与 2.x 有什么区别。自己与记录一下在 Spring Boot 3.x 过程…