如何在NodeJS中允许表单数据

我最近创build了一个接受文件的API。 我正在尝试使用邮差testingAPI。 如果我使用x-wwww-form-urlencoded正文types发布post请求,那么所有的工作,我得到所有预期的数据。 唯一的问题是它不允许发送文件。 如果我使用form-data体types,它允许您发送文件,我不会在后端收到任何东西。 不知道邮差是否有问题,或者我做错了什么。 我的直觉是后端目前不接受form-data ,这就是为什么我没有收到任何数据。 我能做些什么来改变这种状况?

我的标题看起来像这样到目前为止,

 res.setHeader('Access-Control-Allow-Origin', origin); res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, form-data"); 

app.js

 app // static route will go to the client (angular app) .use(express.static('client')) // secured routes .use('/api', secured_route) // add a user route .post('/user', user_api_controller.add_user) // delete this in the production .use(function(req, res, next) { res = allowed_orgins(req, res); next(); }) ; allowed_orgins = function (req, res){ var allowedOrigins = ['http://localhost:4200', 'http://localhost:8100']; var origin = req.headers.origin; if(allowedOrigins.indexOf(origin) > -1){ res.setHeader('Access-Control-Allow-Origin', origin); res.header("Access-Control-Allow-Methods", "GET, POST, PATCH, PUT, DELETE, OPTIONS"); res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, multipart/form-data"); } return res; } 

user_api_controller.js

 module.exports.add_user = function (req, res) { console.log(req.body.username); console.log(req.body.other_parameters); } 

如果我使用form-data ,我什么也没有打印出来,但是当我使用x-wwww-form-urlencoded时候它工作正常。


我使用过multer middle ware ,但我还没有得到任何东西。 当我的后端将收到一些东西时,中间件发挥作用。 我试图获取form-data的纯文本字段,我也没有得到这一点。 这意味着我的后端无法接收所有form-data字段,而不仅仅是文件,而是文本字段。

在这里,我的超级简单的例子:

 const express = require('express') const fileUpload = require('express-fileupload'); const app = express() app.use(fileUpload()); app.post('/file-upload', function(req, res, next) { console.log(req.body.msg); console.log(req.files); res.send('ok'); next(); }); app.listen(3000, function () { console.log('Example app listening on port 3000!') }) 

对不起,我不使用邮差,但我使用curl ,它适用于我:

 curl http://localhost:3000/file-upload \ -H "Content-Type: multipart/form-data" \ -F "file=@/YourDir/YourFile.txt" \ -F "msg=MyFile" 

所以你可以尝试一下,testing一下,获得要点,并使用这个curl命令与你的应用程序一起玩。

file upload的Content-Type头实际上是multipart/form-data而不是form-data 。 要在邮差中正确上传文件,请点击此处: https : //github.com/postmanlabs/postman-app-support/issues/1441#issuecomment-289452571

在后端,你需要一个库来处理multipart/form-data请求。 如果您使用expressjs,那么这个库将适合您的需要https://www.npmjs.com/package/multer

以下是如何使用multer

1)首先安装Muller

 npm install --save multer 

2)在你的代码中包含库(注意上传目录必须存在)

 var multer = require('multer') var upload = multer({ dest: 'uploads/' }) 

3)使用upload作为您的add_user端点的中间件(使用包含上传文件的字段名填写括号)

 app // other endpoints .post('/user', upload.single(/* file field name in your form */), user_api_controller.add_user) 

4)该文件可以在你的user_api_controller.js中访问

 module.exports.add_user = function (req, res) { console.log(req.file); }