1210-express路由划分+bodyParser解析post参数 & 静态服务中间件 & redirect重定向

495 阅读2分钟

路由的划分,更加方便我们管理维护路由

需求:

  • 用户管理模块 登录 /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;
})