前言
这两天在慕课网看了一个关于Nodejs比较基础的视频教程Nodejs全栈入门-慕课网,适合初学者进行学习,介绍了Nodejs相关的基本环境(安装nodejs、npm、npx、nrm、nvm、nodemon等工具的使用),express框架相关(路由、中间件、异常处理)、sequelize ORM数据库框架、最后第三章使用express+mysql+sequelize实现了一个todo list的任务管理小型后台项目,还有关于使用pm2这个工具进行nodejs程序的运维和发布。
简介
整个项目重点分为2部分,前端通过react+redux实现UI界面和状态管理,后端使用express做web框架,使用mysql作为数据存储,利用 sequelize作为ORM,便于通过nodejs管理和操作mysql。
关于作者
作者笔名为一缕孤烟,是一名资深Web前端工程师,曾参与开发大型电商平台,现任职于某国企互联网公司,担任Web前端项目经理一职,带领8人团队。8年Web前端项目开发经验,具有丰富的H5,vue,react等开发和教学经验,热爱研究乐于分享。
课程须知
1、对React、Redux熟练使用
2、了解js基本语法
3、对API调用有一定的实战经验
老师告诉你能学到什么?
1、实现一个web服务,提供标准的API服务
2、了解js在服务器端的基本知识
3、基本的mysql管理知识
4、了解ORM以及相关框架的使用
5、了解基本的web服务运维相关的知识
课程视频列表
第1章 搭建前端全栈开发需要的本地基本环境
- 1-1 课程介绍 (02:09)
- 1-2 nodejs安装 (03:24)
- 1-3 第一个nodejs程序 (06:34)
- 1-4 nodejs和npm介绍 (02:59)
- 1-5 nodemon介绍 (10:57)
- 1-6 nrm和npm介绍 (10:51)
第2章 web应用基础知识以及express框架
- 2-1 web应用基础和第一个express应用 (14:48)
- 2-2 路由的介绍和路由定义规则 (05:19)
- 2-3 express路由演示 (06:49)
- 2-4 express路由API使用 (05:53)
- 2-5 express路由API使用 (11:28)
- 2-6 中间件 (25:00)
- 2-7 异常处理 (10:38)
- 2-8 mysql安装和使用 (09:40)
- 2-9 sequlize集成和使用 (20:10)
第3章 使用express+mysql+sequelize实现任务管理项目
- 3-1 需求分析 (07:10)
- 3-2 api设计 (14:01)
- 3-3 ORM模型创建 (06:58)
- 3-4 API具体实现 (20:45)
- 3-5 前端效果演示 (06:11)
- 3-6 运维和发布 (07:59)
第4章 课程回顾
- 4-1 项目回顾 (06:32)
项目实战
需求说明,API说明
- 1.根据客户端传递过来的不同的参数(状态/页码) 查询 任务列表
- 2.实现 新增一个任务的功能 (名称/截止日期/内容)
- 3.实现一个 编辑的功能:根据客户端 传递的 任务对象(已经存在的数据)
进行编辑, (名称/截止日期/内容/ID) - 4.删除一个任务 (ID)
- 5.修改任务的状态 (ID/状态--待办/完成)
API实现
数据库的初始化
- 创建一个数据库
- 使用
sequelize cli
初始化项目的数据库配置信息
npx sequelize init
- 生成模型文件
- A. migrate 文件
- B. model 文件
npx sequelize model:generate --name Todo --attributes name:string,deadline:date,content:string
- 持久化, 模型对应的[数据库表]
npx sequelize db:migrate
API里面具体使用ORM模型
- ORM模型创建
- API具体实现
项目的发布和运维
pm2
启动命令/运维命令/运维命令/运维文档
- pm2 start ecosystem.config.js
- pm2 logs
- pm2 restart ecosystem.config.js
课程回顾
技术栈
nodejs-->http,异常
web框架,express、hapi、koa、egg
参数校验
4。 mysql的使用,了解ORM, sequelize 使用
技术的关键点
api
web->webserver->router->handler->orm->db注意事项
需要详细的 模型设计->模型之间的关系
api的使用文档-->api文档的使用工具
测试,测试用例
任务api源代码
/* jshint esversion: 8 */
const express = require('express')
const router = express.Router()
const models = require('../db/models')
/**
* [model:Todo]
* sequelize
* Sequelize
*/
/**
* 查询任务列表
*/
router.get('/list/:status/:page', async (req, res,next)=>{
// 1. 状态 1:表示待办, 2:完成,3:删除,-1:全部
// 2. 分页的处理
let {status,page} = req.params;
let limit = 10;
let offset = (page-1)*limit;
let where = {};
if (status != -1) {
where.status = status;
}
let list = await models.Todo.findAndCountAll({
where,
limit,
offset
})
res.json({
list,
message: '列表查询成功'
})
})
/**
* 创建一个todo任务
*/
router.post('/create',async (req,res,next)=>{
try {
let { name, deadline, content } = req.body;
let todo = await models.Todo.create({
name,
deadline,
content
})
res.json({
todo,
message: '任务创建成功!'
})
} catch (error) {
next(error)
}
})
/**
* 修改一个todo任务
*/
router.post('/update', async (req,res,next)=>{
try {
let { id, name, deadline, content } = req.body;
let todo = await models.Todo.findOne({
where: {
id
}
})
if (!todo) {
return res.json({
message: `任务${id}不存在`
})
}
// 执行任务更新
todo = await todo.update({
name,
deadline,
content
})
res.json({
todo,
message: '修改任务成功'
})
} catch (error) {
next(error)
}
})
/**
* 修改一个todo任务的状态
* 修改任务的状态 (ID/状态--待办/完成)
*/
router.post('/update_status', async (req,res,next)=>{
try {
let { id, status } = req.body;
let todo = await models.Todo.findOne({
where: {
id
}
})
if (todo && status != todo.status) {
// 执行更新
todo = await todo.update({
status
})
} else {
return res.json({
message: `任务${id}不存在或者修改的status和原来的status相同!`
})
}
res.json({
todo
})
} catch (error) {
next(error)
}
})
/**
* 删除一个todo任务
*/
router.delete('/delete/:id', async (req,res,next)=>{
try {
let { id } = req.params;
let todo = await models.Todo.findOne({
where: {
id
}
})
if (!todo) {
return res.json({
message: `任务${id}不存在`
})
}
if (todo) {
// 执行更新
todo = await todo.destroy({
})
}
if (todo == null) {
res.json({
message: `任务${id}删除成功`
})
}
} catch (error) {
next(error)
}
})
module.exports = router
RestClient api.http测试接口的文件
### 使用RestClient VSCode插件进行后端API接口测试
@baseurl = http://127.0.0.1:3000
### 根路径接口测试
GET {{baseurl}}
### 获取status为2,page为1的任务列表数据
GET {{baseurl}}/todo/list/2/1
### 获取所有的任务数据(status为-1,page为2的任务列表数据)
GET {{baseurl}}/todo/list/-1/2
### 发送JSON数据
### 新增任务
POST {{baseurl}}/todo/create
Content-Type: application/json
{
"name": "修手机",
"deadline": "2020-08-23 17:00:00",
"content": "帮老板修手机 下午5点前要完成"
}
### 修改任务
POST {{baseurl}}/todo/update
Content-Type: application/json
{
"id": 5,
"name": "学习任务005",
"deadline": "2020-08-23T07:16:00.000Z",
"content": "帮助小明补习功课"
}
### 修改任务的状态
POST {{baseurl}}/todo/update_status
Content-Type: application/json
{
"id": 8,
"status": 3
}
### 删除一个id为8的任务
DELETE {{baseurl}}/todo/delete/8
后端todo_api源代码下载和运行
下载todo_api后端源代码
可惜这个视频只有后端部分,没有前端的代码。关于后端todo_api的源代码我上传到自己的Github上面了,地址为:todo_api
git clone https://github.com/ccf19881030/todo_api.git
使用npm或者cnpm安装依赖
下载好todo_api源代码后,进入到项目根目录,执行npm install命令安装依赖
npm install
npm start运行程序
在项目根目录下运行npm start启动项目
npm start
前提:安装配置好mysql数据库
1、需要在本地或者服务器比如腾讯云、阿里云上面配置安装好mysql数据库并创建数据库todo_development以及对应的表todos,然后修改todo_api/db/config/config.json文件
{
"development": {
"username": "root",
"password": "123456",
"database": "todo_development",
"host": "127.0.0.1",
"dialect": "mysql",
"timezone": "+08:00"
},
"test": {
"username": "root",
"password": "123456",
"database": "todo_development",
"host": "127.0.0.1",
"dialect": "mysql"
},
"production": {
"username": "root",
"password": "123456",
"database": "todo_development",
"host": "127.0.0.1",
"dialect": "mysql"
}
}
其中数据库连接信息需要根据自己的配置进行修改。
下面是我在自己的Windows10系统下使用VSCode运行的后端截图:
使用postman进行后端接口测试
发现postman是目前最好的一款http接口测试工具了,我很喜欢用这款软件用于http接口的测试。
当然也可以使用REST Client插件、fiddler、curl命令行工具。
参考资料
- Nodejs全栈入门-慕课网视频教程
- Sequelize ORM
- PM2 Qucik Start
- postman
- REST Client 测试(vscode插件)
- VSCode插件推荐 | REST Client: 也许是比Postman更好的选择