路由的划分,更加方便我们管理维护路由
需求:
- 用户管理模块 登录 /user/login 返回登录页 注册 /user/reg 返回注册页
- 文章管理模块 发表文章 /article/post发布文章 删除文章 /article/delete
//不进行路由划分:
let express = require('express');
let app = express();
app.listen(3000);
app.get('/login',(req,res)=>{
res.send('登录')
});
app.get('/reg',(req,res)=>{
res.send('注册')
})
app.get('/post',(req,res)=>{
res.send(req.body)// req.body是post参数解析而成,解析是通过bodyParser解析
})
app.get('/delete',(req,res)=>{
res.send('删除文章')
})
//user.js
let express = requir('express');
//创建一个路由,返回的router也是一个函数,是app.use中的监听函数
let router = express.Router);
let path = require('path');
router.get('/login',(req,res)=>{
res.sendFile(path.join(__dirname,'../views/login.html'))
})
router.get('/reg',(req,res)=>{
res.sendFile(path.join(__dirname,'../views/reg.html'))
//path.resolve 和path.join 不同之处。
//resolve 会以当前运行的入口文件的目录作为基准去解析路径。
//join纯静态拼接路径
})
module.exports = router;
//article.js
let express = require('express');
let router = express.Router();
router.post('/post',(req,res)=>{
res.send('发布文章')
});
router.get('/delete',(req,res)=>{
res.send('删除文章')
})
module.exports = router;
//server.js 入口文件
let express = require('express');
let app = express();
app.listen(3000)
//post请求参数会放到body中,
//请求头: application/x-www-form-urlencoded 的请求 接收到body参数 是 x=1&b=2
//请求头:application/json 的请求接收到的body参数是 "{x:1,b:2}"
//利用中间件统一处理post参数;
function bodyParser(){
return function(req,res,next){
let str = "";
req.on('data',chunk=>{
str += chunk
})
req.on('end',()=>{
if(req.headers['content-type'] == 'application/x-www-form-urlencoded'){
req.body = require('querystring').parse(str)//内置模块,可解析x=1&a=2字符串为对象
}else{
req.body = JSON.parse(str)
}
next();
})
}
}
//app.use(bodyParser())
let bodyParser = require('body-parser');//第三方包,需要安装,可以将post参数解析,挂载到req.body上
app.use(bodyParser.urlencoded({extended:false}));// 解析application/x-www-form-urlencoded格式
app.use(bodyParser.json());//解析application/json格式
app.use(bodyParser.text());//解析application/text格式
let user = require('./routers/user');
app.use('/user',user); //利用中间件匹配开头的原理,配合路由实现。
let article = require('./routers/article')
app.use('/article',article)
静态服务中间件
let express =require('express');
let app = express();
app.listen(3000);
function static(p){//dist目录下的静态文件
return function(req,res,next){
let path = require('path');
let fs =require('fs');
let P = path.join(p,req.path);
fs.stat(P,(err,stats)=>{
if(err){
return next();
}
if(stats.isFile()){
res.sendFile(P,{root:__dirname})
}
})
}
}
//app.use(static('dist'));//自定义静态服务中间件
//app.use(static('public'));//自定义静态服务中间件 静态文件不能重名,会先去dist找 找不到在去public中招
//express 自带了静态服务中间件
app.use(express.static('dist'));
app.use(express.static('publick'));
后端api实现重定向
let express = require('express');
let app = express();
app.listen(3000)
app.get('/',(req,res)=>{
//res.redirect('http://www.baidu.com')
res.header('Location','http://www.baidu.com')
res.statusCode = 302;
res.end;
})