需求分析
- 查询API(状态、页码、行数)
- 新增API(任务名称、截止日期、内容)
- 修改:首先通过查询API(ID)获得修改行数据,修改API提交最终修改(任务名称、截止日期、内容、ID)
- 删除API(ID)
-
api设计
初始化项目:
mkdir nodejs-express-vue-backEndcd nodejs-express-vue-backEndgit initnpm init -y// 创建.gitignore文件,添加忽略配置:node_modules、.lhnpm i express sequelize sequelize-cli mysql2 body-parser -Snpm i nodemon -Dmkdir 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=5002.所有业务异常:status=10033.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//查看服务器运行日志
