【问题标题】:Node.js, multer and req.body emptyNode.js、multer 和 req.body 为空
【发布时间】:2017-01-28 01:53:40
【问题描述】:

这是我的问题,我有一个可以插入文件和字段的表单,但我只收到文件而不是参数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>

有人可以帮助我吗?

【问题讨论】:

  • 你试过req.body吗?
  • @abdulbarik :是的,我尝试返回 req.body 但返回 {}
  • @abdulbarik 谢谢,我试过了,但没有任何改变,无论如何,正如我在回答中写的那样,我解决了简单地将请求移动到上传功能......为什么会出现问题?我不知道,重要的是现在它可以工作了!

标签: node.js upload multer


【解决方案1】:

将您的console.log(req.body) 移动到upload(req,res,function(err) {...})

默认的 express body-parser 不能与 multipart/form-data 一起使用,因此我们使用 multer 来解析可以在您的上传函数中访问的表单数据。

【讨论】:

    【解决方案2】:

    你需要重新排列前端请求的字段,下面我会解释,

    我正在使用 multer 在我的 nodejs 应用程序。

    邮递员请求截图(错误):

    邮递员请求截图(正确方法):

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

    我花了将近 2 个小时才找到这个。 肯定工作。试试看吧。

    【讨论】:

    • 你的节点代码是什么样的?你在使用中间件 request.body 吗?
    • 谢谢,学到了更重要的一件事:“在请求内容的最后附加媒体文件”
    【解决方案3】:

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

    【讨论】:

    • 为什么我得到一个空的 req.body?
    • 我在更改序列后收到自定义参数
    • 我在使用 Postman 测试 API 时遇到了同样的问题。重新排序字段,以便文件上传最后一次为我修复了它。谢谢!!
    • 只有我一个人觉得这个上下文很奇怪吗?
    • 如果我在使用 memoryStorage() 而不是 DiskStorage() 时遇到同样的问题该怎么办?
    【解决方案4】:

    我解决了在帖子功能末尾移动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);
    
        });
    });
    

    如果有人能告诉我为什么我会乐于学习新事物!但是,现在,我解决了!

    【讨论】:

    • 效果很好,但为什么呢?谁能解释一下?
    • 嘿,body-parser 不处理 multipart/form-data 主体,但 multer 可以。这就是为什么你只能在上传函数中访问 req.body。
    • @Angie 请考虑提交您的评论作为答案,这是我的问题的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    相关资源
    最近更新 更多