Express初探——获取表单提交数据

2017/7/2 express

# 使用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

详细使用,参考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

使用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

以上方法就基本上可以处理Express的表单了。