Node.js,multer和req.body为空

时间:2016-09-20 08:20:50

标签: node.js upload multer

这是我的问题,我有一个表单,我可以插入文件和字段,但我只收到文件,而不是参数test!为什么呢?

这是我的代码:

app.js:

var express = require('express');
var bodyParser = require('body-parser');
var app = express();
var port = 8000;
var multer = require('multer'); // v1.0.5
var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads');
  },
  filename: function (req, file, callback) {
    callback(null, file.originalname.substring(0,file.originalname.lastIndexOf('.')) + '-' + Date.now() + file.originalname.substring(file.originalname.lastIndexOf('.'),file.originalname.length));
  }
});
var upload = multer({ storage : storage}).single('fileUpload');

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

app.post('/api/upload',function(req,res){
    console.log(req.body);
    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    });
});

app.listen(port, function () {
    console.log('Express server inizializzato sulla porta ' + port);
});

的index.html:

<html>
    <head>
        <title>Test upload</title>
    </head>
    <body>
        <form name="form" action="http://localhost:8000/api/upload" method="post" enctype="multipart/form-data">
            <input type="text" name="test" />
            <input type="file" name="fileUpload" />
            <input type="submit" value="invia" />
        </form>
    </body>
</html>

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:23)

2017年更新

From Readme

  

请注意,req.body可能尚未完全填充。这取决于客户端将字段和文件传输到服务器的顺序。

我通过颠倒前端表单对象属性的顺序解决了我的问题:

    var newFormObj  = new FormData();
    newFormObj.append('internalUserID', internalUserID);
    newFormObj.append('listingImage', this.binaryImages[image]);

在后端:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
    console.log(req.body.internalUserID) // YAY, IT'S POPULATED
    cb(null, 'listing-pics/')
  },                    
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }                     
});                     

var upload = multer({ storage: storage });

答案 1 :(得分:5)

我决定在帖子功能结束时移动req.body

app.post('/api/upload?:test',function(req,res){

    upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
        res.end("File is uploaded");
    console.log(req.body);

    });
});

如果有人能告诉我为什么我会乐于学习新事物!但是,就目前而言,我已经解决了!

答案 2 :(得分:4)

您需要重新安排前端请求中的字段,下面我将解释

我正在使用 multer 来上传多个文件和单个文件 nodejs 应用程序。

邮递员请求屏幕截图(错误): enter image description here

邮递员请求屏幕截图(正确方法): enter image description here

查看字段顺序的差异。始终将媒体文件附加到要求的内容的最后。

我几乎花了2个小时才找到这个。 明确地工作。试试吧。