# 使用body-parser
如果使用express-generator来创建一个应用,那么body-parser是默认引用的,实际上在Express4.x之前是集成在Express里面的,只是后面拆分开来了。如果是自己手动创建的Express应用,那么就需要安装一个body-parser了
npm install --save body-parser
# 基础使用
var express = require('express');
var bodyParser = require('body-parser');
var app = express();
//在路由之前使用
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
//对于post请求,使用body获取数据
app.post('/login', function (req, res) {
if (!req.body) return res.sendStatus(400);
res.send('welcome, ' + req.body.username);
})
//对于get请求,使用query获取数据
app.get('/login?username=1', function (req, res) {
res.send('welcome, ' + req.query.username);
})
//使用params获取数据
app.get('/hello/:name', function(req, res) {
console.log(req.params.name);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
详细使用,参考npmjs上的body-parser (opens new window),GitHub (opens new window)
# 使用express-formidable
使用body-parser不能处理multipart body数据,如果表单有enctype="multipart/form-data"
这种属性的话,就会返回一个空对象。
使用formidable可以方便的处理表单处理。
如果要对所有的表单都使用formidable
来处理的话,就直接在根目录的js文件里面使用
app.use(require('express-formidable')({
uploadDir: path.join(__dirname, 'public/img'), // 设置上传文件目录
keepExtensions: true // 保留后缀
}));
//使用
//在需要获取表单数据的地方
//如果是get方法请求的就使用req.query
router.get('/test', function (req, res, next) {
console.log(req.query)
res.render('test');
});
//如果是post请求
router.post('/test', function (req, res, next) {
console.log(req.fields) //获取普通文本
console.log(req.files) //获取上传的文件
res.render('test');
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用formidable之后,处理表单就很方便了。但是有一个问题就是如果表单里面有文件要上传,那么每次都是上传一个文件到服务器上,即使没有选择也是如此,所以需要手动处理文件(包括重命名文件,删除无效的文件等)。
因此,我们可以根据实际情况,在需要的地方使用formidable
处理单个的表单。
router.post('/upload/avatar', function (req, res, next) {
var form = new formidable.IncomingForm();
form.encoding = 'utf-8';
form.uploadDir = __dirname + '/../public/tmp/'; //不要传相对路径
form.keepExtensions = true;
form.maxFieldsSize = 2 * 1024 * 1024;
form.parse(req, function(err, fields, files) {
if (err) {
console.log(err);
}
//fs.renameSync(files.avatar.path, newPath);//可以对文件重命名
fs.unlink(files.avatar.path, function () { //删除原来的文件
});
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
以上方法就基本上可以处理Express的表单了。