注意:只有当我在邮递员中使用表单数据正文表格时(我必须使用该表格,因为我想在文本字段旁边发送文件),我得到:
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');
});
提前致谢。
答案 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
。
它将解决您的问题。