Node.js,多路复用器和请求主体为空

7gs2gvoe  于 2022-12-26  发布在  Node.js
关注(0)|答案(6)|浏览(181)

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

有人能帮我吗?

pgky5nke

pgky5nke1#

2017年更新

来自自述文件
注意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 });
ufj5ltwl

ufj5ltwl2#

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

我正在使用multer在我的nodejs应用程序中上传多个文件和单个文件。
Postman 请求截图(错误):

Postman 请求屏幕截图(正确方法):

查看字段顺序的差异。始终在请求内容的最后附加媒体文件。
我花了将近2个小时才找到这个。绝对有效。试试吧。

af7jpaap

af7jpaap3#

我在post函数的末尾解决了移动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);

    });
});

如果有人能告诉我为什么我会乐于学习新的东西!但是,现在,我下定决心了!

yebdmbv4

yebdmbv44#

将您的console.log(req.body)移入upload(req,res,function(err) {...})
默认的express body-parser不能处理multipart/form-data,因此我们使用multer来解析可以在upload函数中访问的form-data。

whitzsjs

whitzsjs5#

如果其他人来到这里,有一个稍微复杂的初始布局,如下图所示,移动上传功能到文件中的每一个路线,并使用他们那里似乎已经解决了这个问题。为什么它是如此喜怒无常,我不知道,老实说,这是一个巨大的头痛。

  • 应该注意的是,我有一个自定义存储引擎,它将文件流式传输到磁盘,这可能导致了这个问题,但它只发生在1个特定的路由,该路由在功能上与其他几个功能完全相同,工作完美。*

希望有一天这能帮助到其他人。

初始应用程序布局

应用程序

import express from 'express';
import multer from 'multer';

import profilePicture from './routes/profile-picture.ts';

const upload = multer();

class Server {
    constructor() {
        this.app = express()
    }

    setRoutes() {
        this.app.use( '/upload', upload.single( 'profile' ), profilePicture );
    }

    // ... other methods
}

配置文件-图片.ts

import { Router } from 'express';

const profilePicture = Router();

profilePicture.post( '/', ( req, res, next ) => {
    console.log( req.body ); // This was always empty, regardless of field order
    // do something with req
}

由于某种原因更新了工作布局

应用程序

import express from 'express';

import profilePicture from './routes/profile-picture.ts';

class Server {
    constructor() {
        this.app = express()
    }

    setRoutes() {
        this.app.use( '/upload', profilePicture );
    }

    // ... other methods
}

配置文件-图片.ts

import { Router } from 'express';
import multer from 'multer';

const upload = multer();

const profilePicture = Router();

profilePicture.post( '/', upload.single( 'profile' ), ( req, res, next ) => {
    console.log( req.body ); // No longer empty, hooray!
    // do something with req
}
pzfprimi

pzfprimi6#

您可以使用javascript手动重新排序字段,以确保字段在文件之前发送。

相关问题