Node.js,multer和req.body为空

Fil*_*980 15 upload node.js 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);
});
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

有人可以帮帮我吗?

dma*_*man 33

2017年更新

来自自述文件

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

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

    var newFormObj  = new FormData();
    newFormObj.append('internalUserID', internalUserID);
    newFormObj.append('listingImage', this.binaryImages[image]);
Run Code Online (Sandbox Code Playgroud)

在后端:

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 });
Run Code Online (Sandbox Code Playgroud)

  • 为什么我得到了一个空的 req.body? (2认同)
  • 我在使用 Postman 测试 API 时遇到了同样的问题。重新排序字段,使文件上传最后为我解决了这个问题。谢谢你!! (2认同)

tam*_*n s 16

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

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

邮递员请求截图(错误): 在此处输入图片说明

邮递员请求截图(正确方法): 在此处输入图片说明

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

我几乎花了 2 个小时才找到这个。绝对工作。就试一试吧。


Fil*_*980 7

我决定req.body在post函数结束时移动:

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);

    });
});
Run Code Online (Sandbox Code Playgroud)

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

  • Hei,body-parser不处理multipart/form-data体,但multer确实如此.这就是为什么你只能访问上传功能中的req.body. (4认同)