express(使用multer)错误:Multipart:找不到边界,POSTMAN发送请求

时间:2018-04-06 12:23:33

标签: node.js forms express multer

注意:只有当我在邮递员中使用表单数据正文表格时(我必须使用该表格,因为我想在文本字段旁边发送文件),我得到:

Error: Multipart: Boundary not found

当我使用x-www-form-urlencoded时一切正常。 (当body-parser用作中间件时当然

这是请求内容:(由邮递员制作)

POST /test HTTP/1.1
Host: localhost:3000
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Cache-Control: no-cache
Postman-Token: 61089a44-0b87-0530-ca03-a24374786bd1

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="test"

a simple word
------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="data"

good
------WebKitFormBoundary7MA4YWxkTrZu0gW--

index.js:

var express = require('express');
var app = express();

var multer = require('multer');
var upload = multer();

app.post('/test', upload.array(), function (req, res, next) {
    console.log(req.body.test);
    console.log(req.body);
});

app.listen(3000, function () {
    console.log('app started');
});

提前致谢。

3 个答案:

答案 0 :(得分:10)

我找到了解决方案。我只需要阻止Postman发送Content-Type标题。所以我只是从请求标题中删除了它。

也许对某人有所帮助。

答案 1 :(得分:1)

对于那些在前端方面有相同问题并且想知道从哪里删除标头的人,我将在user9150719上进行一些扩展。

我有同样的问题;我试图从Angular应用发布到我的Nodejs服务器。我的帖子请求包括原始数据和文件输入。所以我在想FormData()

角度服务

//Declare header variables. 

formDataHeader = {
        headers: new HttpHeaders({
          Accept: 'application/json',
          'Access-Control-Allow-Origin': '*',
          'Content-Type': 'multipart/form-data',
          Authorization: 'Bearer ' + this._myService.getToken()
        })
      };

//Post function to Nodejs server
    addNewContact(contact: FormData): any {

        return this._httpClient.post(
          environment.apiBaseUrl + '/contacts', // POST /api/contacts
          (contact), // contact data,
          this.formDataHeader
        );
    }

我的formData已正确设置。我能够获取所有数据,但是问题是我在请求中设置了几个标头,导致user9150719遇到了什么情况。

我的解决方案是简化标题:

formDataHeader = {
        headers: new HttpHeaders({
          Authorization: 'Bearer ' + this._myService.getToken()
        })
      };

要指出的另一重要事项是,我不需要在enctype="multipart/form-data"标签上设置<form></form>

即使我进行了httpInterceptor设置(我认为它不能正常工作),我仍然需要在所有请求中添加Authorization标头,但必须在所有其他{{1} }导致我的api调用返回意外结果。

最后,我认为(但我不确定)我不需要设置额外的标头的原因是因为在我的NodeJS服务器中,我已经配置了期望的标头。

Node.JS服务器

headers

所以我认为,如果您的服务器设置为处理某些类型的标头(Content-Type,Authorization,Origin等),则发送请求时,您不必在前端再次设置这些标头到服务器。存在某些例外,例如// app.js app.use('/public/uploads', express.static('uploads')); app.use('/public', express.static('public')); app.use(express.static(path.join(__dirname, 'public'))); app.use(cors()); app.use((req, res, next) => { res.header('Access-Control-Allow-Origin', '*'); res.header('Access-Control-Allow-Headers', 'x-www-form-urlencoded, Origin, X-Requested-With, Content-Type, Accept, Authorization, *'); if (req.method === 'OPTIONS'){ res.header('Access-Control-Allow-Methods', 'GET, PUT, POST, PATCH, DELETE, OPTIONS'); res.setHeader('Access-Control-Allow-Credentials', true); return res.status(200).json({}); } next(); }); app.use(bodyParser.urlencoded({limit: '50mb', extended: true})); app.use(bodyParser.json({limit: '50mb', extended: true})); ,在某些情况下需要设置;可能是因为它们以Authorization的形式携带了某些数据或与此有关的某些东西。

我希望这对外面的人有帮助!

答案 2 :(得分:0)

对于 JMeter 邮递员,从标头中删除Content-Type

它将解决您的问题。