Nodejs全栈入门-慕课网

时间:2022-07-28
本文章向大家介绍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章 搭建前端全栈开发需要的本地基本环境

第2章 web应用基础知识以及express框架

第3章 使用express+mysql+sequelize实现任务管理项目

第4章 课程回顾

项目实战

需求说明,API说明

  • 1.根据客户端传递过来的不同的参数(状态/页码) 查询 任务列表
  • 2.实现 新增一个任务的功能 (名称/截止日期/内容)
  • 3.实现一个 编辑的功能:根据客户端 传递的 任务对象(已经存在的数据) 进行编辑, (名称/截止日期/内容/ID)
  • 4.删除一个任务 (ID)
  • 5.修改任务的状态 (ID/状态–待办/完成)

API实现

数据库的初始化

  1. 创建一个数据库
  2. 使用 sequelize cli 初始化项目的数据库配置信息 npx sequelize init
  3. 生成模型文件
  • A. migrate 文件
  • B. model 文件 npx sequelize model:generate --name Todo --attributes name:string,deadline:date,content:string
  1. 持久化, 模型对应的[数据库表] npx sequelize db:migrate

API里面具体使用ORM模型

  • ORM模型创建
  • API具体实现

项目的发布和运维

pm2

启动命令/运维命令/运维命令/运维文档

  1. pm2 start ecosystem.config.js
  2. pm2 logs
  3. pm2 restart ecosystem.config.js

课程回顾

  1. 技术栈
  2. nodejs–>http,异常
  3. web框架,express、hapi、koa、egg
  4. 参数校验 4。 mysql的使用,了解
  5. ORM, sequelize 使用
  6. 技术的关键点 api web->webserver->router->handler->orm->db
  7. 注意事项
  8. 需要详细的 模型设计->模型之间的关系
  9. api的使用文档–>api文档的使用工具
  10. 测试,测试用例

任务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命令行工具。

参考资料