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)
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如同鱼与熊掌,二者不可得兼。