Node.js(使用express & bodyParser):无法从提交请求中获取表单数据

lmyy7pcs  于 2023-04-29  发布在  Node.js
关注(0)|答案(7)|浏览(170)

我似乎无法恢复发送到我的Node的post请求的表单数据。js服务器。我在下面放了服务器代码和post请求(在chrome中使用postman发送):

发布请求

POST /api/login HTTP/1.1
Host: localhost:8080
Cache-Control: no-cache

----WebKitFormBoundaryE19zNvXGzXaLvS5C
Content-Disposition: form-data; name="userName"

jem
----WebKitFormBoundaryE19zNvXGzXaLvS5C

NodeJS服务端代码

var express    = require('express');        // call express
var app        = express();                 // define our app using express
var bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
app.use(bodyParser());

app.all('/*', function(req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Headers', 'Content-Type,accept,access_token,X-Requested-With');
    next();
});

var port = process.env.PORT || 8080;        // set our port

var router = express.Router();              // get an instance of the express Router

router.get('/', function(req, res) {

    res.json({ message: 'I am groot!' });   
});

// Login
router.route('/login')

    .post(function(req, res){

        console.log('Auth request recieved');

        // Get the user name
        var user = req.body.userName;

        var aToken = getToken(user);

        res.json({

            'token':'a_token'
        });
    });

app.use('/api', router);

app.listen(port);

login方法尝试获取req.body.userName,但是req.body始终为空。我在SO上看到过其他描述这种行为的案例,但没有一个相关的答案适用于这里。
谢谢你帮忙

goqiplq2

goqiplq21#

一般来说,Express应用需要指定适当的body-parser middleware,以便req.body包含正文。
[编辑]
1.如果您需要解析url编码的(非多部分)表单数据以及JSON,请尝试添加:

// Put this statement near the top of your module
var bodyParser = require('body-parser');

// Put these statements before you define any routes.
app.use(bodyParser.urlencoded());
app.use(bodyParser.json());

首先,您需要将body-parser添加到package.jsondependencies属性,然后执行npm update
1.要处理多部分表单数据,bodyParser.urlencoded()正文解析器将无法工作。请参阅此处建议的模块来解析多部分主体。

pnwntuvh

pnwntuvh2#

我跟着这个https://www.tutorialspoint.com/expressjs/expressjs_form_data.htm

var bodyParser = require('body-parser');
var multer = require('multer');
var forms = multer();

// apply them

app.use(bodyParser.json());
app.use(forms.array()); 
app.use(bodyParser.urlencoded({ extended: true }));

// how to use

router.post('/', function(req, res) {
    console.log(req.body);
    console.log('received the widget request');
});
fhg3lkii

fhg3lkii3#

要处理支持文件上传的multipart/form-data请求,需要使用multer模块。npm link for multer middleware

i7uq4tfw

i7uq4tfw4#

  • 对于Json:使用body-parser
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))

(you还应发送Content-Type:请求报头中的application/json

  • 对于范式或多部分表单(包含文件的表单),使用body-parser + multer
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: true}))
app.use(multer().array())

(You在这种情况下不应该发送Content-Type: application/json。你应该什么都不发送,或者Content-Type: multipart/form-data,如果你有表格中的文件。

  • 在Postman中,您不应该手动发送Content-Type: multipart/form-data。否则,你会得到一个错误(Boundary not found)。(它将自动添加此内容。).)
whitzsjs

whitzsjs5#

请确保按此顺序放置:bodyParser.首先使用json()。app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true }));

kgqe7b3p

kgqe7b3p6#

确保你没有把enctype写成multipart/form-data,body parser不支持它。在定义任何路由之前,请使用下面的线。
app.use(bodyParser.return();app.use(bodyParser.public void run();

ryevplcw

ryevplcw7#

我发现,在我的例子中,我没有在HTML输入标记中使用“name”属性。我通过改变来修复它:

这个

<input id="first_name" />

为了

<input id="first_name" name="first_name" />

相关问题