第一章 搭建前端全栈开发需要的本地基本环境
1-1 课程介绍
-
开发环境的准备
-
- 安装
Nodejs - 第一个
Nodejs程序 Nodejs和npm介绍- 介绍
nodemon,实现热启动 - 使用
nrm解决npm源的问题 - 使用
nvm管理Nodejs版本问题
- 安装
-
Web应用基础 -
Web应用以及Express介绍- 使用
Express搭建第一个Web服务 - 路由(
Routing)的介绍和使用 - 中间件(
Middleware)介绍和使用 - 自定义编写中间件
- 异常处理
Mysql的安装和基本命令使用ORM框架Sequelize介绍和使用
-
项目实战(
Todo) -
梳理和总结
1-2 NodeJS 安装
- 通过下载官方安装包进行安装
- 在
mac os中通过Homebrew安装 - 使用
nvm版本管理器安装(推荐)
1-3 第一个 Nodejs 程序
win.js
const win = require('os');
// 显示系统的cpu信息
console.log(win.cpus());
// 显示系统剩余的内存比例
const freemen = win.freemem()/1024/1024/1024; //byte KB MB GB
const totalmem = win.totalmem()/1024/1024/1024; //byte KB MB GB
console.log('freemen/totalmem:', parseInt(freemen/totalmem*100));
// 显示当前系统的网络状况
console.log(win.networkInterfaces());
console.log(win.arch());
console.log(win.platform());
console.log(win.release());
console.log(win.type());
console.log(win.userInfo());
console.log(win.loadavg());
server.js
// 第一个 nodejs 程序
const http = require('http');
const hostname = '127.0.0.1';
const port = "50000";
// 创建一个 server 实例
const server = http.createServer((req, res) => {
// req:请求对象
// res:响应对象
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('hello node');
})
server.listen(port, hostname, () => {
// 回调
console.log(`服务启动成功,监听端口:${port}`);
})
// 启动服务 node server.js
1-4 Nodejs 和 npm 介绍
1-5 Nodemon 介绍和使用
-
Nodemon特性介绍 -
项目集成和配置演示
-
项目下执行
npm install nodemon -D -
修改 package.json 中的启动命令
"scripts": { "dev:node": "node ./src/index.js", "dev": "nodemon ./src/index.js", "test": "echo \"Error: no test specified\" && exit 1" },
-
- 第一行:打印 `nodemon` 的版本
- 第二行:输入 `rs` 重新启动项目
- 第三行:监听 所有的路径
- 通过 `nodemon.json` 文件修改 `watch` 的路径,项目下新建 `nodemon.json` 文件
> nodemon.json
```json
{
"watch": ["./src/**/*.*"]
}
```
- 第四行:监听 `js` `mjs` `json` 文件
1-6 nrm 和 nvm 的介绍使用
使用 nrm 管理 npm 源
-
使用
npm全局安装nrmnpm install nrm -g -
使用以下命令查看
npm源 -
nrm ls
npm -------- registry.npmjs.org/
yarn ------- registry.yarnpkg.com/
cnpm ------- r.cnpmjs.org/
taobao ----- registry.npm.taobao.org/
nj --------- registry.nodejitsu.com/
npmMirror -- skimdb.npmjs.com/registry/
edunpm ----- registry.enpmjs.org/
- 使用以下命令查看
nrm的常用命令 -
nrm -h
ls List all the registries
current Show current registry name
use <registry> Change registry to registry
add <registry> <url> [home] Add one custom registry(使用私有源时,使用该命令)
使用 nvm 管理 nodejs 版本
windows安装参考
-
使用以下命令查看
node版本nvm ls -
使用以下命令查看
nvm的常用命令 -
nvm -h
nvm ls 查看已经安装的所有nodejs版本nvm install 版本号 可安装指定版本的nodejs nvm use 版本号 即可切换到指定版本 nvm uninstall 版本号 卸载指定版本
第二章 Web 应用基础
2-1 Web 应用基础和 Express 介绍
-
什么是
web应用提供API服务的称为 web 应用 eg:前端 (ajax/as/up ----> 服务器(web 应用) ----> 缓存/数据库)
-
Express在web应用中的作用构建 http 服务,接受 req 处理 res,防攻击 路由
node中的一种 web 框架
-
使用
Express搭建一个web应用-
创建
Express项目目录mkdir express-myapp
cd express-myapp
-
使用以下命令创建
package.json文件和.git文件夹,并创建.gitignore文件.DS_Store node_modules/ /dist/ npm-debug.log* yarn-debug.log* yarn-error.log* static/mock # Editor directories and files .idea .vscode *.suo *.ntvs* *.njsproj *.slnnpm init -y
git init
-
使用下面命令下载并安装
Express并将其保存到依赖列表中npm install express -S
-
在项目下创建
src文件夹,在文件夹下创建index.js文件index.js
// 引入 express const express = require('express') // 创建 expres 实例 const app = express() const port = 3000 // http://127.0.0.1:3000 // app.use((req, res) => { // res.json({ // name: 'vience' // }) // }) // http://127.0.0.1:3000/name app.get('/name', (req, res) => { let {age} = req.params res.send('vience') }) app.get('/name/:age', (req, res) => { let {age} = req.params res.json({ name: 'vience', age }) }) app.post('/name', (req, res) => { let {age} = req.params res.send('vience_post') }) app.listen(port, () => { console.log(`Example app listening on port ${port}!`) }) -
使用
nodemon启动项目,安装配置参考 1-5
-
2-2 Route 介绍和使用
Route是什么
Route 是指确定应用程序如何响应客户端对特定端点的请求(url ---> 网络 ---> dns解析 ---> 目标服务器 --->路由)
特定端点是URI(或路径)和特定的HTTP请求方法
每个路由可以具有一个或多个处理程序函数,这些函数在匹配该路由时执行。
app.METHOD(PATH, HANDLER)
app是的express的实例。METHOD是小写的HTTP请求方法 (getpostputdelete)PATH是服务器上的路径。HANDLER是匹配路线时执行的功能。
2-3 Express 路由演示
在之前的项目中
index.js文件中进行下面代码的编写
- 通过请求的方法类型
get/post/put/delete
app.get('/demo', function (req, res) {
res.json({
message: 'Hello Express Route from get demo'
})
})
app.post('/demo', function (req, res) {
res.json({
message: 'Hello Express Route from post demo'
})
})
- 通过URI
// GET http://127.0.0.1:3000/user/byname?name=vience
app.get('/user/byname', function (req, res) {
let { name } = req.query
res.json({
name
})
})
// GET http://127.0.0.1:3000/user/byid?id=10001
app.get('/user/byid', function (req, res) {
let { id } = req.query
res.json({
id
})
})
2-4 Express 路由 API 使用
app.all 的是使用
-
需要定义一个 api/路由 需要满足 客户端 无论使用什么请求方式(get/post/delete/put) 都可以得到响应
// GET/POST/DELETE/PUT http://127.0.0.1:3000/demo1 app.all('/demo1', (req, res) => { res.json({ message: 'demo1', method: req.method }) }) -
需要定义一个 api/路由 需要满足 客户端 无论使用什么请求URI 都可以得到响应(日志)
// GET/POST/DELETE/PUT http://127.0.0.1:3000/* app.all('*', (req, res) => { res.json({ message: 'demo1', method: req.method, URI: req.path }) })
2-5 Express 路由 API 使用
app.use 的使用 --->中间件
-
需要定义一个 api/路由 需要满足 客户端 无论使用什么请求方式(get/post/delete/put) 都可以得到响应
// GET/POST/DELETE/PUT http://127.0.0.1:3000/demo1 app.use('/demo2', (req, res) => { res.json({ message: 'demo2', method: req.method }) }) -
需要定义一个 api/路由 需要满足 客户端 无论使用什么请求URI 都可以得到响应
// GET/POST/DELETE/PUT http://127.0.0.1:3000/* app.use((req, res) => { res.json({ message: 'demo1', method: req.method, URI: req.path }) }) -
路由的切割与使用
-
需求: 现有订单模块路由和会员模块路由
-
首先在
src下创建router文件夹, 在router文件夹下创建member.js和oeder.js两个路由模块 -
文件中代码如下
member.js
const express = require('express'); const router = express.Router(); router.get('/list', (req, res) => { res.json({ list: [ { id: 001, name: '李四' }, { id: 002, name: '张三' } ] }) }) module.exports = router;order.js
const express = require('express'); const router = express.Router(); router.get('/list', (req, res) => { res.json({ list: [ { id: 001, price: 200, name: '鞋子' }, { id: 002, price: 500, name: '宝宝' } ] }) }) module.exports = router; -
在
index.js中引入这两个路由模块(中间件),代码如下// 路由切割与使用 // GET http://127.0.0.1:3000/member/list const memberRouter = require('./router/member'); app.use('/member', memberRouter) // GET http://127.0.0.1:3000/order/list const orderRouter = require('./router/order'); app.use('/order', orderRouter)
-
-
2-6 中间件的介绍和使用
-
什么是
express中间件可插拔的功能
中间件的结构
- 一个函数
- err, req, res, next、
功能
- 异常处理
- 处理业务功能,然后转交控制权-->next
- 响应请求--结束响应-->当作路由的处理函数
级别
- app级别的使用(全局)
- 注册的时候,一定在最顶级
- app.use --> api加载进来
- router jibie
- 异常处理 -->app级别
- 内置级别
-
内置中间件和第三方中间件
-
自定义中间件
2-7 异常处理
- 异常捕获
- Express 内置异常处理
- 自定义异常处理