学习内容
- express 模块介绍
- express 模块搭建服务器
- express 模块路由及路由表配置
- express 模块中间件
express 模块介绍
Web 应用程序
Express 是一个保持最小规模的灵活的 Node.js Web 应用程序开发框架,为 Web 和移动应用程序提供一组强大的功能。
API
使用您所选择的各种 HTTP 实用工具和中间件,快速方便地创建强大的 API。
性能
Express 提供精简的基本 Web 应用程序功能,而不会隐藏您了解和青睐的 Node.js 功能。
框架
许多 流行的开发框架 都基于 Express 构建。
express 模块搭建服务器
> app.js
//1 导入express模块
const express = require('express');
//导入所有路由处理函数
const { fnGoodsList } = require('./controller/goods');
const { fnLogin } = require('./controller/users');
//2. 创建服务
const app = express();
//配置静态目录
app.use(express.static('./www'));
//配置路由
//get请求
app.get('/goods/list',fnGoodsList)
//post请求
app.post('/users/login',fnLogin);
// 监听端口
app.listen(8080,() => {
console.log('服务已开启');
})
> www/views/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<link rel="stylesheet" href="/css/index.css">
</head>
<body>
<h1>我是首页</h1>
<script src="/js/index.js"></script>
</body>
</html>
> www/css/index.css
body{
background-color: skyblue;
}
> www/js/index.js
console.log('hello node!');
fn1();
function fn1(){
let xhr = new XMLHttpRequest();
xhr.open('get','/goods/list?current=1&pagesize=12');
xhr.onload = function(){
let res = JSON.parse(xhr.responseText);
console.log(res);
}
xhr.send();
}
fn2();
function fn2(){
let xhr = new XMLHttpRequest();
xhr.open('post','/users/login');
xhr.onload = function(){
let res = JSON.parse(xhr.responseText);
console.log(res);
}
xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
xhr.send('us=李四&ps=456');
}
> controller/goods.js
//存放所有商品相关的路由处理函数
function fnGoodsList(req,res){
res.send({code: 1,msg: '接收get请求成功',params: req.query});
}
//导出
exports.fnGoodsList = fnGoodsList;
> controller/users.js
//存放所有用户相关路由处理函数
function fnLogin(req,res){
res.send({
code: 1,
msg: '成功,但是还没有解析请求体,参数暂时不能带回'
})
}
exports.fnLogin = fnLogin;
express 模块路由及路由表配置
> app.js
//1 导入express模块
const express = require('express');
//导入路由表
// const GoodsRouter = require('./router/goods');
// const UserRouter = require('./router/users');
// const CartRouter = require('./router/cart');
const Router = require('./router/index');
//2. 创建服务
const app = express();
//配置静态目录
app.use(express.static('./www'));
//配置路由
// app.use('/goods',GoodsRouter);
// app.use('/users',UserRouter);
// app.use('/cart',CartRouter);
app.use('/api',Router);
// 监听端口
app.listen(8080,() => {
console.log('服务已开启');
})
> www : 同上
> controller/goods.js
//存放所有商品相关的路由处理函数
function fnGoodsList(req,res){
res.send({code: 1,msg: '接收get请求成功',params: req.query});
}
function fnDetail(req,res){
res.send({code: 1,msg: '获取商品详情成功'});
}
function fnCartList(req,res){
res.send({code: 1,msg: '获取购物车列表成功',list: [{},{},{},{}]})
}
//导出
exports.fnDetail = fnDetail;
exports.fnGoodsList = fnGoodsList;
exports.fnCartList = fnCartList;
> controller/users.js
//存放所有用户相关路由处理函数
function fnLogin(req,res){
res.send({
code: 1,
msg: '成功,但是还没有解析请求体,参数暂时不能带回'
})
}
function fnRegister(req,res){
res.send({
code: 1,
msg: '用户注册'
})
}
exports.fnLogin = fnLogin;
exports.fnRegister = fnRegister;
> router/goods.js
//路由分表
const goodsRouter = require('express').Router();
const { fnGoodsList } = require('../controller/goods');
//配置路由
goodsRouter.get('/list',fnGoodsList);
//导出路由
module.exports = goodsRouter;
> router/users.js
//路由分表
const userRouter = require('express').Router();
//导入路由处理函数
const { fnLogin,fnRegister } = require('../controller/users');
//添加路由
userRouter.post('/login',fnLogin);
userRouter.post('/register',fnRegister);
//导出路由
module.exports = userRouter;
> router/cart.js
//1. 导入模块
const cartRouter = require('express').Router();
//导入路由处理函数
const { fnCartList } = require('../controller/goods');
//配置路由
cartRouter.get('/list',fnCartList);
//导出路由
module.exports = cartRouter;
> router/index.js
//路由总表
const router = require('express').Router();
//添加路由
router.use('/goods',require('./goods'));
router.use('/users',require('./users'));
router.use('/cart',require('./cart'));
//导出路由总表
module.exports = router;
express 模块中间件
1. 内置中间件 static
2. 自定义中间件(全局、局部)
3. 第三方中间件 (body-parser)
注:中间件使用,一定注意 next
> app.js
//1. 导入模块
const express = require('express');
const fs = require('fs');
//导入路由总表
const router = require('./router');
//2. 创建服务
const app = express();
//3. 配置静态资源(静态中间件)
app.use(express.static('./www'));
//4. 配置路由
//全局中间件
app.use(function(req,res,next){
//将当前请求的地址记录下来
fs.appendFile('./info.txt',`
${new Date()} ---- ${req.url} \n
`,(err) => {});
next();
})
app.use('/api',router);
//5. 监听端口
app.listen(8080,() => {
console.log('server ok,port: 8080');
})
> controller/goods/js
//存放所有商品相关的路由处理函数
function fnGoodsList(req,res){
let { current,pagesize } = req.query;
res.send({code: 1,msg: '获取商品列表成功',info: `你需要获取的是第${current}页数据,一页显示${pagesize}条`});
}
function fnDetail(req,res){
res.send({code: 1,msg: '获取商品详情成功'});
}
function fnCartList(req,res){
res.send({code: 1,msg: '获取购物车列表成功',list: [{},{},{},{}]})
}
//导出
exports.fnDetail = fnDetail;
exports.fnGoodsList = fnGoodsList;
exports.fnCartList = fnCartList;
> middleware/goods.js
//goods相关接口使用的中间件
exports.testGetList = (req,res,next) => {
const { current,pagesize } = req.query;
//验证
if(!current && pagesize){
res.send({code: 0,msg: '参数current或pagesize没有传递'});
return;
}
if(isNaN(current) || isNaN(pagesize)){
res.send({code: 0,msg: '参数格式不对,current或pagesize必须是一个数字'});
return;
}
next();
}
> router/index.js
const Router = require('express').Router();
Router.use('/goods',require('./goods'));
Router.use('/users',require('./users'));
Router.use('/cart',require('./cart'));
module.exports = Router;
> router/goods.js
//存放goods相关路由信息
//导入路由处理函数
const { fnGoodsList,fnDetail } = require('../controller/goods');
//导入相关中间件
const { testGetList } = require('../middleware/goods');
//1. 导入express创建路由表
const express = require('express');
let GoodsRouter = express.Router();
//2. 在路由表上添加路由
GoodsRouter.get('/list',testGetList,fnGoodsList);
GoodsRouter.get('/detail',fnDetail);
//3. 导出路由表
module.exports = GoodsRouter;
> router/cart.js
const { fnCartList } = require('../controller/goods');
const CartRouter = require('express').Router();
//添加一个中间件
CartRouter.use((req,res,next) => {
//进行token验证
const token = req.headers.authorization;
if(!token){
res.send({code: 0,msg: 'token错误'});
return;
}
next();
})
CartRouter.get('/list',fnCartList);
module.exports = CartRouter;
# 解析请求体的中间件
> app.js
//1. 导入模块
const express = require('express');
const fs = require('fs');
const bodyParser = require('body-parser');
//导入路由总表
const router = require('./router');
//2. 创建服务
const app = express();
//3. 配置静态资源(静态中间件)
app.use(express.static('./www'));
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())
//4. 配置路由
//全局中间件
app.use(function(req,res,next){
//将当前请求的地址记录下来
fs.appendFile('./info.txt',`
${new Date()} ---- ${req.url} \n
`,(err) => {});
next();
})
app.use('/api',router);
//5. 监听端口
app.listen(8080,() => {
console.log('server ok,port: 8080');
})
> controller/users.js
const express = require('express');
//存放所有用户相关路由处理函数
function fnLogin(req,res){
const { us,ps } = req.body;
if(!(us && ps)){
res.send({
code: 0,
msg: '参数不够'
})
return;
}
res.send({
code: 1,
msg: '成功',
info: {
us,
ps
}
})
}
function fnRegister(req,res){
res.send({
code: 1,
msg: '用户注册'
})
}
exports.fnLogin = fnLogin;
exports.fnRegister = fnRegister;