Nodejs全栈入门-慕课网
前言
这两天在慕课网看了一个关于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章 课程回顾
项目实战
需求说明,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更好的选择
- 在虚拟机间NFV应用上使用采用DPDK的Open vSwitch
- ONOS集群选举分析
- OpenStack Spice协议配置
- 源码解读ODL的MAC地址学习(二)
- SpringBoot开发案例之整合Spring-data-jpa进阶篇
- SpringBoot开发案例之微信小程序录音上传
- SpringBoot开发案例之微信小程序文件上传
- SpringBoot开发案例之配置静态资源文件路径
- 源码解读ODL的MAC地址学习(一)
- SpringBoot开发案例之配置Druid数据库连接池
- SpringBoot开发案例之mail中文附件乱码
- SpringBoot开发案例之整合Swagger篇
- SpringBoot开发案例之整合mail队列进阶篇
- SpringBoot开发案例之集成SSL证书
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一个小小的签到功能,到底用 MySQL 还是 Redis ? ?
- 下载丨9月数据库技术通讯:Redo日志丢失,重建遭遇ORA-16433处理
- knative serving 组件分析
- 在 minikube 上部署 knative
- 认识 JS 静态类型检查工具 Flow
- PostgreSQL中如何实现密码复杂度检查?
- JS/TS 对数组中的对象按对象的值进行去重
- JS/TS 对数组中的对象按相同值进行分组
- CSS 实现输入框从右往左和反向倒序输入
- SAP Spartacus PagelayoutComponent里的template
- Python实战 | 送亲戚,送长辈,月饼可视化大屏来帮忙!
- SAP Spartacus PagelayoutComponent里的section和slot
- SAP Spartacus ComponentData的提前subscription
- 如何在 SwiftUI 中使用手势
- jQuery 尺寸、位置操作