1. 认识Web框架
- 目前在Node中比较流行的Web服务器框架是express、koa;
- express早于koa出现,并且在Node社区中迅速流行起来:
- 可以基于express快速、方便的开发自己的Web服务器;
- 并且可以通过一些实用工具和中间件来扩展自己功能;
Express整个框架的核心就是中间件
2. Express安装
express的使用过程有两种方式:
- 方式一:通过express提供的脚手架,直接创建一个应用的骨架;
- 方式二:从零搭建自己的express应用结构;
方式一:安装express-generator
安装脚手架
npm install -g express-generator
创建项目
express express-demo
安装依赖
npm install
启动项目
node bin/www
方式二:从零搭建自己的express应用结构;
npm init -y
3. Express的基本使用
// express本质上是一个函数:createApplication
const express = require('express')
// 创建app
const app = express();
// 监听默认路径
// get
app.get('/', (req, res, next) => {
res.end("hello express")
})
// post
app.post('/', (req, res, next) => {
res.end('hello post express')
})
// 开启监听
app.listen(8000, () => {
console.log('express服务器启动成功')
})
4. 认识中间件
- Express是一个路由和中间件的Web框架,它本身的功能非常少:
- Express应用程序本质上是一系列中间件函数的调用;
- 中间件的本质是传递给express的一个回调函数;
- 这个回调函数接受三个参数:
- 请求对象(request对象);
- 响应对象(response对象);
- next函数(在express中定义的用于执行下一个中间件的函数);
- 中间件中可以执行哪些任务
- 执行任何代码;
- 更改请求(request)和响应(response)对象;
- 结束请求-响应周期(返回数据);
- 调用栈中的下一个中间件;
const express = require('express')
const app = express();
// 编写普通的中间件
// use注册一个中间件(回调函数)
app.use((req, res, next) => {
console.log('注册了01普通中间件')
res.end('hello world')
next()
})
app.use((req, res, next) => {
console.log('注册了02普通中间件')
next()
})
app.use((req, res, next) => {
console.log('注册了03普通中间件')
})
app.listen(8000, () => {
console.log('普通中间件启动成功')
})
5. 应用中间件 – 自己编写
express主要提供了两种方式:app/router.use和app/router.methods;
6. 客户端发送请求的方式
- 方式一:通过get请求中的URL的params;
- 方式二:通过get请求中的URL的query;
- 方式三:通过post请求中的body的json格式;
- 方式四:通过post请求中的body的x-www-form-urlencoded格式;
- 方式五:通过post请求中的form-data格式;
7. 响应数据
end方法
- 类似于http中的response.end方法,用法是一致的
json方法
- json方法中可以传入很多的类型:object、array、string、boolean、number、null等,它们会被转换成 json格式返回;
status方法
8. Express的路由
以使用 express.Router来创建一个路由处理程序:
user.js
const express = require('express')
const router = express.Router()
router.get('/', (req, res, next) => {
res.json(["why", "kobe", "lilei"])
})
router.get('/:id', (req, res, next) => {
res.json(`${req.params.id}用户的信息`)
})
router.post('/', (req, res, next) => {
res.json("create user success")
})
module.exports = router
// express本质上是一个函数:createApplication
const express = require('express')
const userRouter = require('./routers/users')
// 创建app
const app = express();
// 注册路由
app.use("/users", userRouter)
app.use("/products", productRouter)
// 开启监听
app.listen(8000, () => {
console.log('express路由服务器启动成功')
})
9. 静态资源服务器
Node也可以作为静态资源服务器,并且express给我们提供了方便部署静态资源的方法;
10. 服务端的错误处理
// express本质上是一个函数:createApplication
const express = require('express')
// 创建app
const app = express();
const USERNAME_DOES_NOT_EXISTS = "USERNAME_DOES_NOT_EXISTS";
const USERNAME_ALREADY_EXISTS = "USERNAME_ALREADY_EXISTS";
app.post('/login', (req, res, next) => {
// 加入在数据中查询用户名时, 发现不存在
const isLogin = false;
if (isLogin) {
res.json("user login success~");
} else {
// res.type(400);
// res.json("username does not exists~")
next(new Error(USERNAME_DOES_NOT_EXISTS));
}
})
app.post('/register', (req, res, next) => {
// 加入在数据中查询用户名时, 发现不存在
const isExists = true;
if (!isExists) {
res.json("user register success~");
} else {
// res.type(400);
// res.json("username already exists~")
next(new Error(USERNAME_ALREADY_EXISTS));
}
});
app.use((err, req, res, next) => {
let status = 400
let message = "";
switch(err.message) {
case USERNAME_DOES_NOT_EXISTS:
message = "username does not exists~"
break;
case USERNAME_ALREADY_EXISTS:
message = "username alreday exists~"
break;
default:
message = "NOT FOUND~"
}
res.status(status)
res.json({
errCode: status,
errMessage: message
})
})
// 开启监听
app.listen(8000, () => {
console.log('express服务器启动成功')
})