如何在NodeJS中允许表单数据

时间:2017-10-20 18:45:04

标签: node.js api postman

我最近创建了一个接受文件的API。我正在尝试使用Postman测试API。如果我使用x-wwww-form-urlencoded正文类型发布帖子请求,一切正常,我会得到所有预期的数据。唯一的问题是它不允许发送文件。如果我使用form-data正文类型,允许您发送文件,我不会在后端收到任何内容。不确定Postman是否有问题,或者我做错了什么。我的预感是后端当前不接受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字段,不仅仅是文件,还包括文本字段。

2 个答案:

答案 0 :(得分:0)

文件上传的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)首先安装multer

npm install --save multer

2)在您的代码中包含库(请注意,uploads目录必须存在)

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

答案 1 :(得分:0)

这是我的超级简单表达示例:

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"

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