技能学习:学习使用Node.js + Vue.js,开发前端全栈网站-8.server端使用通用CRUD接口

简介: CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。
1.什么是CRUD
CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。

目的是我们将常用的增、删、改、查操作封装在一套接口组件中,在多个功能中重复调用这一套接口组件,从而使代码更精简,同时提升开发效率。

2.在本项目中的接口优化实现方法说明

我们根据已经写好的单个功能接口进行改动讲解。

首先,我们再次深度理解server端接口页面:
在这里插入图片描述
(1)项目中,我们以node.js作为后端进行服务器的开发。就像PHP后端的ThinkPHP框架一样,在node中我们使用express框架,所以接口页面我们要首先引入express。
(2)该路由文件指向admin端,需要使用express框架的路由进行接口的调用。
(3)引用定义好的数据库模型,一切数据通过模型定义的字段和类型进行判断与上传。
(4)编写接口。

第二步,我们要找出在不同功能模块中调用接口时需要变化的地方,此时我们用分类功能文章功能的两套接口做比较。
在这里插入图片描述
在图中我们可以看出,接口方法基本相同,不同的地方就是接口路由地址数据库表的模型名。所以要想使用通用CRUD接口,只需要将接口路由地址和模型名做成从前端接收数据的变量即可。

第三步,更改接口路由地址。

我们需要修改代码参照RESTful风格,rest是一种接口设计风格,大家感兴趣的百度查一查。下面我们直接代码讲解。

// 定义“admin/api”路由方法,挂载存入到router
// RESTful风格接口,在api后加一个rest前缀,与程序员编写代码原则类似,避免以后与其他接口冲突。
// 动态resours资源,用来存放接口路由地址(原categories、articles)。这里写成这样之后,上边的接口地址名就以“/”表示。
app.use('/admin/api/rest/:resourse', router)

将动态resourse添加到路由方法中之后,这个“:resourse”就代表了之前地址中的categories。所以在上边的接口函数中将categories去掉,用“/”替换。
修改前:

// 上传数据(增)
    router.post('/categories', async(req, res) => {
        // 在里边放该接口的具体操作,所有操作同级放置

        // 数据来源是接受到的req中的body
        // 为避免阻塞,要用异步操作,故加入await
        const model = await Category.create(req.body)
        // 接收返回值
        res.send(model)
    })

修改后:

// 上传数据(增)
    router.post('/', async(req, res) => {
        // 在里边放该接口的具体操作,所有操作同级放置

        // 数据来源是接受到的req中的body
        // 为避免阻塞,要用异步操作,故加入await
        const model = await Category.create(req.body)
        // 接收返回值
        res.send(model)
    })

除地址以外都无需变化。

第四步,更改模型的引入。

接口地址修改完成后,同样需要修改模型的引入方法。之前的全局引入方式就不能用了。
在这里插入图片描述
要在接口内部引入,并且使用:

// 查询数据(查)
    router.get('/', async(req, res) => {
        const Model = require('../../models/' + req.params.resourse)
        const items = await Model.find().populate('parent').limit(10)
        res.send(items)
    })

第五步,接收接口地址并将接口名传值给模型,用来当作模型名。

先把admin端axios接口地址改一下,改成rest/categories,方便之后分类列表刷新的测试。
在这里插入图片描述
接口传值在req.params.resourse找到,并将该值放置在模型处,用来当作模型名。
此时找到分类列表页面测试,network中找到错误,显示未定义模型名:
在这里插入图片描述
因为我们在文件全局使用resourse接收,但在接口内部使用传来的值,所以必须在router中合并接收的参数:在这里插入图片描述
修改router后,找到了模型名,但因为接口地址为分类的复数形式,所以模型名接收到的也是复数,所以此时模型名因格式不对同样无法调用模型:
在这里插入图片描述
我们此时要把接收到的模型名转化成单数,这里用到一个类包“inflection”,专门用来操作单复数的转换。

cd admin
npm i inflection

在这里插入图片描述
第六步,使用inflection类包将模型名转化为单数形式。

// 查询数据(查)
    router.get('/', async(req, res) => {
        // 将接收的复数地址名转化为单数模型名
        const modelName = require('inflection').classify(req.params.resourse)
        const Model = require('../../model/' + modelName)
        const items = await Model.find().populate('parent').limit(10)
        res.send(items)
    })

测试,没问题:
在这里插入图片描述
到这里,一个通用CRUD接口就实现了。但是所有接口在模型名进行转化时的操作都相同,所以我们可以在路由方法处加一个中间件的处理函数,不用每次都对model名的转换写一遍:

app.use('/admin/api/rest/:resourse', async (req, res, next) => {
        // 从resourse获取路由地址名,并使用inflection的classify转换为单数形式
        const modelName = require('inflection').classify(req.params.resourse)
        // 为请求数据挂载一个model,方便接口使用此模型名变量
        req.Model = require('../../models/' + modelName)
        next()
    }, router)

上边的模型名就使用中间件函数中挂载到req的model名,把接口中模型的地方全部改成req.model就可以了。
(图片
admin端所有接口地址前加一个“rest/”
(图片
测试所有功能,没问题,包括分类或文章的增删改查、层级关联。
最后上一遍接口文件代码:

module.exports = app => {
    const express = require('express')

    const router = express.Router({
        // 合并参数
        mergeParams: true
    })

    // 新建数据(增)
    router.post('/', async(req, res) => {
        // const Model = require('../../model/' + req.params.resourse)
        const model = await req.Model.create(req.body)
        res.send(model)
    })
    // 查询数据(查)
    router.get('/', async(req, res) => {
        const items = await req.Model.find().populate('parent').limit(10)
        res.send(items)
    })
    // 根据id查询数据(查)
    router.get('/:id', async(req, res) => {
        const model = await req.Model.findById(req.params.id)
        res.send(model)
    })
    // 编辑数据(改)
    router.put('/:id', async(req, res) => {
        const model = await req.Model.findByIdAndUpdate(req.params.id, req.body)
        res.send(model)
    })
    // 删除数据(删)
    router.delete('/:id', async(req, res) => {
        await req.Model.findByIdAndDelete(req.params.id, req.body)
        res.send({
            success: true
        })
    })

    // 定义“admin/api”路由方法,挂载存入到router
    // RESTful风格接口,在api后加一个rest前缀,与程序员编写代码原则类似
    // 动态resours资源,用来存放接口路由地址(原categories、articles)。这里写成这样之后,上边的接口地址名就以“/”表示
    app.use('/admin/api/rest/:resourse', async (req, res, next) => {
        // 从resourse获取路由地址名,并使用inflection的classify转换为单数形式
        const modelName = require('inflection').classify(req.params.resourse)
        // 为请求数据挂载一个model,方便接口使用此模型名变量
        req.Model = require('../../models/' + modelName)
        next()
    }, router)
}

注意,如有错误的地方,要检查admin端组件中axios发送接口请求时的接口地址是否正确,并检查NetWork中的报错信息。实在不行文章评论问我。

相关文章
|
3月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
24天前
|
Dart 前端开发 架构师
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
【01】vs-code如何配置flutter环境-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈-供大大的学习提升
86 26
|
4月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
82 0
|
19天前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
47 10
|
3月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
3月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
71 4
|
3月前
|
前端开发 开发者 C++
独家揭秘:前端大牛们如何高效学习新技术,保持竞争力!
【10月更文挑战第31天】前端技术飞速发展,如何高效学习新技术成为关键。本文通过对比普通开发者与大牛们的策略,揭示了高效学习的秘诀:明确目标、主动探索、系统资源、实践应用和持续学习。通过这些方法,大牛们能更好地掌握新技术,保持竞争力。示例代码展示了如何通过实践加深理解。
71 4
|
3月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
505 1
|
3月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
94 1
|
3月前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
105 1

热门文章

最新文章