Github仓库地址:https://github.com/yydrowz3/notebook_app
之前在图书馆里找到了一本React.js实战,本来也正好在学习,就想着先借回来看看。
书很薄,内容不多。花了一个星期大致把书上的内容过了一遍,说实话没学到什么。React基础的语法和组件化的思想其实之前就稍稍学过,所以这部分内容基本上看明白了。
但是其他的内容就不好说了,Webpack还有测试的Jest都只是简单介绍了概念和基础的使用方法,不过对这些来说也够了。
但是其他很多重要的东西,比如Redux数据管理,React-router路由等,都是大量的给出源代码,缺少对相关原理的解释,不太适合初学者。
书的最后也给出了几个例子,将书中的知识联系起来做个小练习,本篇博客就是这中的一个案例,觉得挺好的所以在这里写点东西复习一下整个的思路。
项目的总体结构
在项目文件夹下先创建两个文件夹backend
和client
,用于分开实现这个记事本的前端和后端,前端主要使用React完成,后端则使用Node的Express框架实现。
1 2 3
| |----notebook_app |----backend |----client
|
后端搭建
先进入backend文件夹,使用npm init
来初始化。
安装依赖
server端使用Node来搭建,使用了Express框架。
数据库选择Mongodb,使用的是mongodb官网提供的512M免费容量的数据库来实现。
通过npm或yarn安装需要用到的依赖工具
npm install body-parser
npm install express
npm install mongoose
npm install morgan
最终的package.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| { "name": "backend", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "dependencies": { "body-parser": "^1.19.0", "express": "^4.17.1", "mongoose": "^6.0.12", "morgan": "^1.10.0" } }
|
MongoDB数据库
创建数据库
在MongoDB官网创建账号和免费的数据库套餐。创建完成后进入控制台界面。
在左边Security中选择进入Database Access,在这里创建用户并赋予相应的权限。
回到控制台主界面,点击connect,在选择链接方式的界面中选择Application。这里因为这个数据库是在线的,所以有很多使用的方式,而我们这个只需要获得相应的链接在mongoose中使用就行。所以选择Application来查看连接地址url。
这里就可以看到数据库的连接url了,在实际中只需要第一行就可以连接了,用户名:密码
这个是刚才创建用户时设定的。@
后面的是这个连接数据库的主机名。第一个/
后面的是数据库的名称,MongoDB允许在连接时连接到一个名称不存在的数据库,这时MongoDB默认会帮你创建这个数据库,所以不会像其他的数据库一样报错。
编写Schema
创建data.js文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const DataSchema = new Schema( { id: Number, message: String, }, { timestamps: true } );
module.exports = mongoose.model('Data', DataSchema);
|
后端主程序
后端主要是接收客户端网页发送过来的请求来进行相应的操作。所以这里用了很多的路由来区分不同的操作。在编写后端API接口时应该要注意使用RESTful的API接口规范,这样更符合设计思路也能方便团队协作。
创建Server.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| const mongoose = require('mongoose'); const express = require('express'); const bodyParser = require('body-parser'); const logger = require('morgan');
const Data = require('./data');
const API_PORT = 3001; const app = express();
const router = express.Router();
const dbRouter = 'mongodb+srv://你的用户名:你的密码@cluster0.2yv5h.mongodb.net/myFirstDatabase'; mongoose.connect(dbRouter, { useNewUrlParser: true }); let db = mongoose.connection; db.once('open', () => console.log('connected to the database'));
db.on('error', console.error.bind(console, 'MongoDB connection error:'));
app.use(bodyParser.urlencoded({ extended: false })); app.use(bodyParser.json());
app.use(logger('dev'));
router.get('/getData', (req, res) => { Data.find((err, data) => { if (err) return res.json({ success: false, error: err }); return res.json({ success: true, data: data }); }); });
router.post('/updateData', (req, res) => { const { id, update } = req.body; Data.findOneAndUpdate(id, update, (err) => { if (err) return res.json({ success: false, error: err }); return res.json({ success: true }); }); });
router.delete('/deleteData', (req, res) => { const { id } = req.body; Data.findOneAndDelete(id, (err) => { if (err) return res.send(err); return res.json({ success: true }); }); });
router.post('/putData', (req, res) => { let data = new Data(); const { id, message } = req.body; if ((!id && id !== 0) || !message) { return res.json({ success: false, error: 'INVALID INPUTS', }); } data.message = message; data.id = id; data.save((err) => { if (err) return res.json({ success: false, error: err }); return res.json({ success: true }); }); });
app.use('/api', router);
app.listen(API_PORT, () => console.log(`LISTENING ON PORT ${API_PORT}`));
|
设置完成后可以在当前目录下node server.js
测试一下看看数据库连接有没有问题。