从bodyParse来看app.use()

csdn没有转发功能,看到好的文章不能mark。只好手动转载过来了。



前言
最近一直在学习慕课网上的express+mongodb建站课程,老师用了很多模块,以前从未见过,因此慢慢看API文档,调代码,试图把每一个框架都搞懂。
前一篇写了express一些用法,这一篇也是接上文的,主要是提到了app.use()。
因为在本项目中,app.use()方法主要用在,app.use(bodyParser())

先贴代码

var express=require('express')
var bodyParser=require('body-parser')
var Movie=require('./models/movie')
var mongoose=require('mongoose')
var port=process.env.PORT||3000
var app=express()

app.set('views','./views/pages')  //设置视图
app.set('view engine','jade') //设置引擎
app.use(bodyParser())
app.listen(port)

console.log('service start at port'+port)

//编写路由

//addmovie page
app.post('/admin/movie/new',function(res,req){
    var id=req.body.movie._id
    var movieObj=req.body.movie
    var _movie
    if(id!=='undefined'){
        Movie.findById(id,function(err,movie){
            if(err){
                console.log(err)
            }
            _movie= _.extend(movie,movieObj)
            _movie.save(function(err,movie){
                if(err){
                    console.log(err)
                }
                res.redirect('/movie/'+movie._id)
            })
        })
    }
    else{
        _movie=new Movie({
            doctor:movieObj.doctor,
            tittle:movieObj.tittle,
            country:movieObj.country,
            language:movieObj.language,
            year:movieObj.year,
            poster:movieObj.poster,
            summary:movieObj.summary,
            flash:movieObj.flash
        })
        _movie.save(function(err,movie){
            if(err){
                console.log(err)
            }
            res.redirect('/movie/'+movie._id)
        })
    }
})

先说bodyParse的使用

var bodyParser=require('body-parser')
app.use(bodyParser())

以前bodyParse是在express模块中,后来单独出来了,所以必须要按照上面的先npm install body-parser,再require,再app.use()



express项目中通常使用body-parser进行post参数的解析,最常用的是其中的json和urlencoded的parser,可分别对以JSON格式的post参数和urlencoeded的post参数进行解析,均可获得一个JSON化的req.body,如:

{
    "username": "user",
    "password": "pass"
}

body-parser还有一个raw parser,可以获取一个buffer对象的req.body。

通过详细阅读body-parser的源代码,可以知道,各个parser会对req headers及post参数进行一系列的判断和处理,只有满足条件的情况下才对post参数进行解析,解析之前,首先使用raw-body模块对req进行处理,其处理过程是将req作为一个readable stream进行处理,从而得到raw body内容,然后按具体的格式进行解析。

在express项目中,通常顺序调用body-parser所提供的parser,这样当一个parser无法满足post参数解析条件时,还可以使用另一个parser进行解析(在某些特殊的请求中,有可能所有parser均无法解析)

app.use(bodyParser.raw);
app.use(bodyParser.json);
app.use(bodyParser.urlencoded({
    extended: false
});

但body-parser的各个parser在解析的过程中,若对满足解析条件的post参数进行了解析,req作为一个stream对象,已经被消耗,无法再使用另一个parser对post参数解析,也即post参数只能被第一个满足解析条件的parser进行解析。因此即使先后调用raw、json、urlencoded这三个parser,也只能得到一个body,具体格式由各parser的调用次序及post参数满足的解析条件决定。JSON化的body和raw body如同鱼与熊掌,二者不可得兼。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值