需求分析
- 查询API(状态、页码、行数)
- 新增API(任务名称、截止日期、内容)
- 修改:首先通过查询API(ID)获得修改行数据,修改API提交最终修改(任务名称、截止日期、内容、ID)
- 删除API(ID)
-
api设计
初始化项目:
mkdir nodejs-express-vue-backEnd
cd nodejs-express-vue-backEnd
git init
npm init -y
// 创建.gitignore文件,添加忽略配置:node_modules、.lh
npm i express sequelize sequelize-cli mysql2 body-parser -S
npm i nodemon -D
mkdir src
//在src文件夹下创建app.js文件
- express web服务框架
- sequelize ORM对象管理模型,用来处理代码与数据库的通信
- sequelize-cli 使用sequelize的脚手架工具
- mysql2 mysql数据库驱动,连接数据库
- body-parser 处理body形式的传参,JSON(例如:post请求) ```javascript const express = require(‘express’); const bodyParser = require(‘body-parser’); const app = express();
/**
- 应用级别中间件
- 处理参数 */ app.use(express.json());
app.use(express.urlencoded());
app.use(bodyParser.urlencoded({ extended: true }));
/**
- API
*/ app.get(‘/list’, (req, res, next) => { // throw new Error(‘异常测试’); // next(new Error(‘异常测试’)); res.json({ list: [] }); });
app.post(‘/create’, (req, res, next) => { let { name, date, content, id } = req.body; res.json({ todo: {}, name, date, content, id, message: “创建成功” }); });
app.post(‘/edit’, (req, res, next) => { let { name, date, content, id } = req.body; res.json({ todo: {}, name, date, content, id, message: “创建成功” }); });
app.post(‘/action’, (req, res, next) => { let { status, id } = req.body; res.json({ status, id, message: “执行成功” }); });
app.post(‘/delete’, (req, res, next) => { let { id } = req.body; res.json({ id, message: “删除成功” });
});
/** 应用级中间件 1.所有错误Error:status=500 2.所有业务异常:status=1003 3.404错误 **/ app.use(‘*’, (req, res, next) => {//404服务器不认为是ERR所以此处使用通配符去处理404异常 res.json({ message: ‘请求资源不存在’ }); }); app.use((err, req, res, next) => { if (err) { res.statusCode = 500; res.json({ message: err.message }); } });
/**
- 创建数据库
- 使用‘sequelize-cli’初始化项目的数据库配置信息npx sequelize init(建议新建一个文件夹,不建议在根目录下执行)
生成模型文件models、migrations.
npx sequelize model:generate —name Business —attributes name:String,date:Date,content:String
持久化 模型对应的【数据库表】
API具体实现
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const models = require('../db/models');
/********************************************
* 应用级别中间件
* 处理参数
*********************************************/
app.use(express.json());
app.use(express.urlencoded());
app.use(bodyParser.urlencoded({ extended: true }));
/********************************************
* API
*********************************************/
app.get('/list',async (req, res, next) => {
// throw new Error('异常测试');
// next(new Error('异常测试'));
//offset代表从第几条记录“之后“开始查询,limit表明查询多少条结果
try {
let { status, page } = req.query;
let limit = 10;//每页10条
let offset = (page - 1) * limit;//开始从那个位置读取数据库
let where = {};
if (status != -1) {
where.status = status;
}
let obj =await models.Business.findAndCountAll({
where,
offset,
limit
});
res.json({
obj
});
} catch (error) {
next(error);
}
});
app.post('/create', async (req, res, next) => {
try {
let { name, date, content } = req.body;
/** 数据持久化到数据库 */
let obj = await models.Business.create({
name, date, content
});
res.json({
obj,
message: "创建成功"
});
} catch (error) {
next(error);
}
});
app.post('/edit', async (req, res, next) => {
try {
let { name, date, content, id } = req.body;
/** 数据持久化到数据库 */
let obj = await models.Business.findOne({
where: {
id
}
});
if (obj) {//防止多人处理
obj = await obj.update({
name,
date,
content
});
res.json({
obj,
message: "修改成功"
});
}
} catch (error) {
next(error);
}
});
app.post('/action', async (req, res, next) => {
try {
let { status, id } = req.body;
let obj = await models.Business.findOne({
where: {
id
}
});
if (obj && status != obj.status) {
obj = obj.update({
status
});
res.json({
obj,
message: "执行成功"
});
} else {
next(new Error('状态与数据库一致,或者行明细不存在'));
}
} catch (error) {
next(error);
}
});
app.post('/delete', (req, res, next) => {
let { id } = req.body;
res.json({
id,
message: "删除成功"
});
});
/**********************************************
应用级中间件
1.所有错误Error:status=500
2.所有业务异常:status=1003
3.404错误
************************************************/
app.use('*', (req, res, next) => {//404服务器不认为是ERR所以此处使用通配符去处理404异常
res.json({
message: '请求资源不存在'
});
});
app.use((err, req, res, next) => {
if (err) {
res.statusCode = 500;
res.json({
message: err.message
});
}
});
/**********************************************
* 监听服务器的端口
**********************************************/
app.listen(8080, () => {
console.log('服务器启动成功!')
});
前端效果演示(略)
运维和发布
pm2是一个工具。
npm i pm2 -g
pm2 init //初始化项目启动或者是运维的脚本
pm2 start ecosystem.config.js //启动服务
pm2 list //查看启动的服务
pm2 restart id/name//重启指定的服务 例如: pm2 restart 0
pm2 log//查看服务器运行日志