MERN技术栈实现CRUD的小项目(万字长文;使用React、Express、Mongodb、node实现前后端结合的增删查改)

2023-11-09

预期效果

  1. 使用React、Express、Mongodb、node
  2. 可以前后端交互,实现增删查改

成品

*pic  项目成果Gif图*

实施过程

1. 创建项目

前端部分的创建

前端依然使用 react-create-app 来创建。

这次用到的依赖有如下的

"classnames": "^2.2.5",
"react-redux": "^5.0.7",
"react-router-dom": "^4.2.2",
"redux": "^3.7.2",
"redux-thunk": "^2.2.0"

偷懒直接从package.json粘的,嘿嘿

这里有一个陌生的,classnames是一个可以用表达式的形式来给DOM加class

其他的都是常用的。

目录结构

*pic 项目目录*

backend 是后台的文件夹,后台的代码就在server.js

public 下的index.html 是网页的起始。剩下的都是关于icon的

src

index.js 是项目的起始,页面的框架和路由在这里

registerServerWorker.js 在这个项目中并不需要

components 中是所有的页面组件

reducers ,,,就是reducer了~~~

actions 中,就是action ~~~

constants 中是变量,防止写错字符串类型但又报错报不到地方的问题

界面UI部分

这个小Demo只有三个tab,分别是home 页,其实啥都没有。中间是list 页,将提交的内容以卡片的形式展示出来。最后一个是form 页,提交数据用的。

这个小项目体验了前端配合node的后台,对数据库增删查改,所以我会以增删查改这四块来介绍这个小项目的逻辑。

Semantic UI

这个小项目的重心并不在样式,所以样式使用了Semantic UI库,是用Boot CDN来引用的。

使用方法也非常简单,在public/index.html 中引用,就可以在所有页面都出现效果,但是编辑代码并不会有代码提示,像我这脑子不太好使的,基本只能看文档了,哈哈哈。下面是引用的代码

<link href="https://cdn.bootcss.com/semantic-ui/2.3.1/semantic.min.css" rel="stylesheet">

在其他页面使用的时候和 Bootstrap 非常相似,都是通过 className 来实现的,比如下面

<button className="ui primary button">Save</button>

tab部分

<div className="ui three item menu">
  <NavLink exact activeClassName="active" className="item" to="/">Home</NavLink>
  <NavLink exact activeClassName="active" className="item" to="/games">Games</NavLink>
  <NavLink activeClassName="active" className="item" to="/games/new">Add New Game</NavLink>
</div>

这是样式,然后设置不同的路由,便可以进行tab切换了

<Route exact path="/" component={
     Home } />
<Route exact path="/games" component={
     GamesPage } />
···

自然,这些组件是要引入的,我这里就不写了。

exact 作用:让路径变得唯一,如果不加,会将两个组件的内容都渲染到后面的路由页面中。

例如:Home中有句“hello”,GamesPage中有句“world”,这样,在/games 中会出现 hello world。不过是两行显示。加入exact 后,每个路由只会渲染自己的组件。

后台搭建

在项目根目录创建一个后台的文件夹backend,里面的server.js 就是后台的入口文件。

这里使用的是node.js搭建,框架是express,数据库为Mongodb,语法为ES6, 所以肯定会用到Babel,另外使用nodemon,改变后台代码后会自动重启服务器。

Babel的用法大家还是看官网了,我用的版本比较老,是6.X,就不做介绍了,推荐使用较新的版本。

首先在server.js 中创建一个实例,并监听在某个端口,然后初始化后台,就能创建这个后台了。

import express from 'express';
const app = express();
app.listen(8180, () => console.log('Server is runing on localhost:8180'))

这个端口是可以任意设置的,但是尽量不要用一些常见的软件或者进程用的端口,不然可能经常由于端口占用而无法启动后台服务。

初始化,express、nodemon、babel安装

npm init -y
npm install express --save
npm install nodemon --save-dev
npm install --save-dev babel-cli babel-preset-env

然后在package.json 中修改start的方法

"start": "nodemon --exec babel-node -- ./server.js"

最后,在终端运行就可以了,如果终端出现了我们 app.listen() 的回调函数的那句话就说明成功了

npm run start

数据库MongoDB的安装与启动

安装Mongodb,我用的是windows电脑(说实话相对 MAC 麻烦一些的),去官网下载可执行文件,下载后常规安装即可,最后有一个Install MongoDB Compass 可以不用勾选,这是一个可视化程序,勾选上安装太慢了,可以后面再安装或者根据自己喜好安装其他的。

以下方法都是基于Windows的方法,如果大家是Mac或者Linux可以去官方文档或者其他文档看一看,因为我没有验证过,所以也不敢随便写。

新建一个数据库存放的文件夹,其中存放数据。

mkdir E:mongodb\data

当然,在文件管理器中建立也是一样的。

命令行运行MongoDB服务器

C:\mongodb\bin\mongod --dbpath E:\mongodb\data

C:\mongodb\bin\mongod 是默认安装位置的mongodb启动程序

如果执行成功,就会输出一些日志信息。**这种方法虽然可以启动mongodb服务器,但是每次启动都要输入这段程序有些太麻烦了,下面介绍一下更加简洁的方法。**由于MongoDB v4.0之后,安装后会自动将mongodb服务添加到windows的服务中,并可以自启动。我们需要做的就会特别简单。

首先需要建立一个日志文件夹

mkdir E:mongodb\log

当然也可以在文件管理中建立。

然后将日志信息定位到这个文件夹中即可,方法是 打开安装目录下C:\mongodb\bin\mongod.cfg

  • 将其中的storage:dbpath改为 E:\mongodb\data
  • systemLog:path 改为 E:\mongodb\log\mongod.log
  • 有人说要修改port,我没修改,跑程序并没有报错,就略过了,以后出错了再看看,哈哈哈,贱
  • 注意一下,这个文件最后有没有一句 mp: 有的话就删了,原因不懂,但是装在C盘好像就会出现这个,不删掉服务器跑不起来

最后贴一下修改后的配置文件

*pic mongod.cfg修改后*

这时候可以打开 Windows的服务,重新启动MongoDB Server

*pic 重启MongoDB*

Express 会在程序中后端创建后再初始化安装,就放到后面再说了。下面直接开始这个项目

后台连接Mongodb服务器

首先需要一个库,常见的有mongodb,mongoose等等,我其实都没用过。

这个项目使用的是mongodb,算是最底层的一个。

贴一段代码

import mongodb from 'mongodb';
const dbUrl = "mongodb://localhost";
mongodb.MongoClient.connect(dbUrl, (err, client) => {
   
  if (err) throw err;
  const db = client.db('crud')
  app.get('/api/games', (req, res) => {
   
    db.collection('games').find({
   }).toArray((err, games) => {
   
      res.json({
    games });
    });
  });
  app.listen(8180, () => console.log('Server is running on localhost:8180'));
})

首先引入mongodb这个库,dbUrl 是数据库的地址,这里就是本地了。

后面一句是连接方法,具体看看文档,由于某些原因,我一直打不开官方网站,就不给大家放网址了。放一个菜鸟教程的,可能由于版本更新,会有变化。

然后判断是否有错,有错就抛出来,然后指定数据库为 crud

之后是一个对api 的处理,作用是找到数据库中所有数据,转换成数组,加一个回调函数,输出json格式。

后面监听的那句也放到连接数据库的方法里面,因为只有数据库连接了再监听才有意义。

最后注意一下 ,前端要跟后台交流,前端需要设置一个代理,代理到后台的地址和端口8180,方法是在最外层的 package.json 中加这样一句

"proxy": "http://localhost:8180"

后台的搭建,数据库连接基本就这些内容,下面就看一下前端是如何对后台数据库进行增删查改的。

redux

首先将redux建立起立,新建一个reducers文件夹,其中的index.js 使用了辅助函数 combineReducers

在 Redux 中,只有一个 store,但是 combineReducers 可以让你拥有多个 reducer,同时保持各自负责逻辑块的独立性

combineReducers 可以把多个不同 reducer 函数作为 value 的 object,合并成一个最终的 reducer 函数。但是这个小项目其实只有 games 一个reducer,是不是这样写都可以。

详细的关于 combineReducers 的了解可以看看这里

下面贴一下代码

import {
    combineReducers } from 'redux';
import games from './games';
export default combineReducers({
    games });

引入的games 就是一个普通的reducer

const games = (state = []) => {
   
	return state;
}
export default games;

可以看到,这里state就是一个数组

使用reducer中数据

components 中新建 GamesPage.js ,这里主要用来接收 store 中的数据,将其返回到页面,连接后台,会有查,和删的内容。

先贴一下代码

class GamesPage extends Component {
   
componentDidMount() {
   
  this.props.fetchGames();
}
  render() {
   
    return (
      <div>
        <GamesList games={
    this.props.games }/>
      </div>
    );
  }
}
const mapStateToProps = (state) => {
   
  return {
   
    games: state.games
  };
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MERN技术栈实现CRUD的小项目(万字长文;使用React、Express、Mongodb、node实现前后端结合的增删查改) 的相关文章

  • java和javaEE、Javase有什么区别?

    Java分三个版本 Java SE 标准版 Java EE 企业版 Java ME 微型版 其中SE就是大家学的Java基础 EE是公司最常用的用于网站开发 PC端 ME用于移动端开发 现在熟悉的安卓系统就是用JAVAME开发的 Java既
  • 口罩检测——模型推理(5)

    文章目录 前言 一 推理准备 二 推理代码 三 结果演示 总结 前言 终于等到你 还好我没有放弃 最后一部分 sbb 上代码 一 推理准备 增加一个文件labels txt 内容是我们的标签 注意放置位置 增加一个inference ipy
  • Lexicography——CF1267L构造题

    L Lexicography time limit per test3 seconds memory limit per test512 megabytes inputstandard input outputstandard output

随机推荐

  • 栈的创建和基本操作

    栈 LIFO 限定仅在表尾进行插入和删除操作的线性表 简单来说就是最后一个进入最早出来 顺序栈 用数组实现 下标为0的一端作为栈底 另一端为栈顶 用top作为栈顶指针 我们定义空栈时top 1 栈结构 typedef struct SqSt
  • wr885n虚拟服务器设置,tp-link wr885n如何用手机设置

    摘 要 下面将给大家详细介绍 用手机设置tp link wr885n路由器上网的方法 这是tp link很早就推出的路由器了 第一步 路由器线路连接 tp link wr885n这台路由器上有5个网线接口 下面将给大家详细介绍 用手机设置t
  • std : : unordered_map 、 std : : unordered_set

    一 简介 std unordered map 是C 标准库中的一种关联容器 它提供了一种用于存储键 值对的数据结构 其中键是唯一的 且不会按特定顺序排序 与 std map 不同 std unordered map 使用哈希表作为其底层数据
  • C++实现字典数据结构

    本文使用C 构建了一个字典数据结构 未使用STL 实现了一个学生成绩录入系统 进而实现了字典数据对象的如下功能 新建一个字典 检查字典非空 得到字典的数据长度 插入一个数对 按学生姓名删除对应的字典数据 按分数查找所有符合的学生姓名 按姓名
  • 自动贩卖机的c语言,自动售货机体统c++编程 问题描述】 自动售货机可以售出A、B、C三种商品,价格分别为1元、2元、知道...

    满意答案 include stdio h include conio h structstDrink floatfPrice 价格intiLeft 剩余数 voidPay stDrink pstPay floatfPay 0 0f if p
  • libuv 多线程与队列

    libuv 多线程与队列 一 libuv编译环境 1 可查看另一篇 libuv 介绍与编译 http mp blog csdn net postedit 79193274 二 原理图 程序代码 main c include
  • canvas做一个简单气泡图

    数据结构 name 土豆 num 200 name 西瓜 num 80 name 黄瓜 num 85 name 粉丝 num 70 name 苹果 num 75 name 香蕉 num 30 name 樱桃 num 5 name 橙子 nu
  • 使用kotlin编写一个无障碍服服务

    Kotlin 是一种非常强大的编程语言 可以轻松实现无障碍服务 它拥有丰富的 API 和库 可以帮助开发人员更轻松地构建可用性强的应用程序 它还具有简单的语法 使开发人员可以快速开发出可靠的无障碍服务
  • JVM常见面试题

    一 了解JVM的发展史 1 Sun Classic VM 早在1996年Java1 0版本的时候 Sun公司发不了一款名为Sun Classic vm的java虚拟机 它同时也是世 界上第一款商业java虚拟机 jdk1 4 时完全被淘汰
  • Qt 实现点击按钮窗体某个部分出来,再点击回去,循环反复

    ui gt widget 3 gt setVisible false ui gt widget 4 gt setVisible false this gt resize 473 229 connect ui gt pushButton 2
  • java合并数组的方法

    在 Java中 数组是一种重要的数据结构 在 Java中数组的操作方式有两种 一种是直接使用数组来操作 另一种是通过引用计数或者双指针对数组进行操作 对于直接使用数组来操作的方式 我们可以通过两个方法来实现 一种是将数组作为参数传递给方法
  • 贪心算法之田忌赛马(超详细)

    简述 手把手教会贪心算法之田忌赛马 超详细 题目 田忌赛马 田忌和齐王赛马 两人各出n匹马 赢一场比赛得200两银子 输了赔200银子 平局不赔不赚 已知两人每匹马的速度 问田忌最多能赢多少银子 多组测试数据 每组数据的第一行是一个整数n
  • 第一次使用leaflet

    1 下载leaflet https leafletjs com download html 2 下载插件leaflet draw http leaflet github io Leaflet draw docs leaflet draw l
  • WFQ-加权公平排队

    WFQ是一个复杂的排队过程 可以保证相同优先级业务间公平 不同优先级业务间加权 队列的数目可预先配置 范围是 16 4096 WFQ 在保证公平 带宽 延迟 的基础上体现权值 权值大小依赖于JP报文头中携带的IP优先级 Precedence
  • java的面向对象的基础

    面向对象基础 一 类和对象 1 1 什么是对象 1 2 面向对象 1 3 类 1 3 1 什么是类 1 3 2 类的特点 1 3 3 类的组成 1 3 4 类的定义 1 4 对象的属性 1 5 对象的行为 1 6 类和对象的关系 1 7 对
  • 编程陷阱_变量被莫名修改

    编程陷阱 变量被莫名修改 源代码 错误点 通道号更新 导致情况 原工程作用 QT中查询10个通道的数据 定义个数组记录每个通道的时间戳 轮询每个通道 源代码 错误点 CHANNEM NUM MAX 定义为 10 通道号更新 目标是轮询通道号
  • 系统架构设计专业技能 · 软件工程之系统分析与设计

    系列文章目录 系统架构设计专业技能 软件工程 一 系统架构设计师 系统架构设计高级技能 软件架构概念 架构风格 ABSD 架构复用 DSSA 一 系统架构设计师 系统架构设计高级技能 系统质量属性与架构评估 二 系统架构设计师 系统架构设计
  • 若依项目整合百度(Ueditor)富文本编辑器

    若依项目整合百度 Ueditor 富文本编辑器 最近项中有用到富文本编辑器 若依自带的功能太过简单 闲来无事整合了百度的富文本编辑器 一路踩坑终是成功了 呜呼 UEditor文档 http fex baidu com ueditor 点击演
  • Golang两款编辑器:Goland 2020 和国产的LiteIDE

    Goland 2020 http www opdown com soft 220835 html 国产的LiteIDE http liteide org cn
  • MERN技术栈实现CRUD的小项目(万字长文;使用React、Express、Mongodb、node实现前后端结合的增删查改)

    预期效果 使用React Express Mongodb node 可以前后端交互 实现增删查改 成品 实施过程 1 创建项目 前端部分的创建 前端依然使用 react create app 来创建 这次用到的依赖有如下的 classnam