Nodejs+Express+MongoDB重构若依管理系统后端框架
前言
这些知识通过B站全站之巅一位UP那学的,内容比较简单,仅仅是一些基础内容,方便大家更好的理解前后端的交互,如果有兴趣可以接着往后学。另外,全站之巅那有好多视频课,也提供了很多的学习资源。在这里感谢每一位乐意去分享知识的小伙伴,希望大家可以一起学习!
一、环境搭建
长话短说,必备环境Node.js,可取官网自行下载,当前我使用的版本为14.16.0。
需要安装MongoDB数据库,并启动MongoDB服务,这一点网上也有安装教程,有不明白的可以私信。
二、项目初始化
这里我们新建一个目录作为项目根目录,进入目录打开cmd,输入以下指令完成npm的初始化,用于记录我们项目中所用到的依赖;
npm init --y
接下来安装我们开发的核心工具:express和mongoose(可查官方文档,我们可以使用mongoose提供的api,帮助我们简化操作mongodb数据库的操作);
npm install express@next mongoose --save
安装完成之后新建一个server.js作为项目的入口文件即可。
// 引入express
const express = require('express')
// 创建app
const app = express()
// 静态托管public文件夹,在public下创建一个index.html文件,启动服务时访问http://localhost:8084可以看到页面
app.use('/', express.static('public'))
// 允许express处理json格式数据,否则将不能处理前端传来的json数据
app.use(express.json())
app.listen(8084, () => {
// http://localhost:8084
console.log(`8084 has been already started ...`);
})
另外,可以安装nodemon工具,可以使服务器进行热更新。如果使用
node server.js
启动服务器的话,修改后则需重新启动。全局安装nodemon工具如下:
npm install nodemon -g
修改package.json下的scripts,可以使用npm start启动服务器。
"scripts": {
"start": "nodemon server.js"
}
三、连接数据库
在根目录创建plugin/db.js文件,输入以下内容:
module.exports = app => {
const mongoose = require('mongoose');
// 在使用“FindAndDupDate()”和“FindAndDelete()”时,将useFindAndModify设置为false,否则会报错
// server-database数据库名称,会自动创建
mongoose.set('useFindAndModify', false);
mongoose.connect('mongodb://127.0.0.1:27017/server-database', {
useCreateIndex: true, // 解决弃用警告
useNewUrlParser: true,
useUnifiedTopology: true,
}, function (error) {
if (error) {
console.log("数据库连接失败")
} else {
console.log("数据库连接成功")
}
})
}
在入口文件server.js引入上面创建好的文件,再启动服务器,就能连接数据库了:
require('./plugins/db')(app)
四、接口开发
经过以上内容,服务器和数据库就已经创建好了,接下来就是开发后台接口,以登录更能为例。
4.1 数据库建表
根目录创建models/User.js,储存用户信息的字段,包括用户名、密码等字段,其他字段可以自行创建。另外,使用mongoose操作数据库添加数据时,会自动添加一个_id的字段,作为唯一标识使用,该字段不会重复。创建表的时候,命名遵循驼峰,首字母大写(个人规范)。
const mongoose = require('mongoose')
const schema = new mongoose.Schema({
// 用户名
userName: {
type: String,
required: true,
unique: true
},
// 密码:加密处理,需安装bcrypt插件,数据库存储加密后的密码
password: {
type: String,
select: false,
set(val) {
return require('bcrypt').hashSync(val, 10)
}
}
}, {
// 定义时间戳,添加数据时会自动加入下面两个字段:createTime和updateTime
timestamps: {
createdAt: 'createTime',
updatedAt: 'updateTime'
}
})
module.exports = mongoose.model('User', schema)
4.2 登录api
根目录创建routes/login.js,以后所有的接口都在routes里面开发,不同模块可以创建不同的文件
module.exports = app => {
const assert = require('http-assert')
const jwt = require('jsonwebtoken')
const User = require('../models/User')
app.post('/login', async (req, res) => {
const {userName, password} = req.body
const user = await User.findOne({userName}).select('+password')
assert(user, 422, '用户名或密码不正确,请重新输入。')
const valid = require('bcrypt').compareSync(password, user.password)
assert(valid, 422, '用户名或密码不正确,请重新输入。')
const token = jwt.sign({
id: user._id
}, app.get('SECRET'))
res.send({
code: 200,
message: '登录成功',
token
})
})
}
大致介绍一下上面代码的逻辑:
第一步:解构出前端传过来的用户名、密码数据;
第二步:拿到用户名后在数据库中进行查找,如果不存在该用户,则登录失败;
第三步:第二步通过后,再校验密码,因为密码是加密的,所以要先解密后在进行对比,如果密码不正确,则登录失败;
第四步:通过上述校验之后,生成token作为认证信息,并返回前端。
细节补充:
①http-assert是一个插件,类似于if-else,不同的是,判断的内容如果为false,则会终止请求,并返回状态码和信息。
②jsonwebtoken是用来生成token的一个工具,使用之前也需要通过npm安装,具体api可以查询官方文档
③app.get(‘SECRET’)为拿到生成token的秘钥,这个秘钥一般是保密的,不会让别人看到的,这里就放在入口文件里,可以使任意内容的字符串:
app.set('SECRET', 'SERVER_DATABASE_2021_0927')
接口写完之后,需要在入口文件里引入
app.require('./routes/login')
结尾
上述内容比较简单,先简单介绍一下,后面会做的更模块化和工程化一些。有不懂的知识可以私信我~
前端代码仓库:https://gitee.com/likeaskingwhy/base-vue-project.git
后端代码仓库:https://gitee.com/likeaskingwhy/base-server-project.git