快递req.body为空

问题描述 投票:0回答:6

我已经尝试了很多 StackOverflow 答案,这种方法通常可以使用 body-parser 来工作,但是我在使用 AJAX 或表单数据从

req.body
获取任何输出时遇到了问题。

server.js

app.use(helmet()); // Helmet middleware
app.use('/assets', express.static('resources/web/assets')); // Makes /assets public
app.use(require('./resources/modules/session.js')); // Custom session middleware
app.set('view engine', 'ejs'); // Sets EJS to the view engine
app.set('views', `${__dirname}/resources/web/pages`); // Sets the views folder
app.use(cookieParser()); // cookie-parser middleware
app.use(bodyParser.urlencoded({ extended: true })); // body-parser's middleware to handle encoded data
app.use(bodyParser.json()); // body-parser's middleware to handle JSON
app.use(fileUpload({ limits: { fileSize: 100 * 1024 * 1024 } })); // express-fileupload middleware (bushboy wrapper)
app.use('/api', require('./resources/routes/api.js')); // External API router
// ...
app.post('/login', (req, res) => {
    console.log(req.body);
    res.render('login', {
        config,
        page: {
            name: 'Login'
        },
        error: ''
    });
    res.end();
});

我的

login.ejs
代码:

            <form method="POST">
                <div class="input-group">
                    <i class="las la-user"></i>
                    <input placeholder="Username" name="username" type="text" required>
                </div>
                <div class="input-group">
                    <i class="las la-lock"></i>
                    <input placeholder="Password" name="password" type="password" required>
                </div>
                <button type="submit">
                    <i class="las la-paper-plane"></i> Login
                </button>
            </form>

无论我尝试什么,我总是在控制台中得到一个空的

{}
,但没有任何效果。我尝试过调试;我需要一双新的眼睛来看看我做错了什么。 这是表单数据: Form Data 我也尝试过使用 jQuery 的 AJAX (
$.get
):

$.post('', {username:'test', password:'test'})
.fail(console.error)
.done(() => console.log('Success'));

enter image description here

编辑:在尝试了 multer 的

app.use(require('multer')().array());
app.use(require('multer')().none());
中间件之后,我仍然遇到同样的老问题,除了
multer
req.body
现在是
undefined
而不是
{}
。这是因为数据被发送为
application/x-www-form-urlencoded
而不是我之前认为的 application/form-data
。既然如此,
body-parser 中间件方法应该可以工作。如果贡献,请不要贡献与解析相关的答案application/form-data

编辑 2:对于那些要求

session.js

 代码的人,这里是:

const enmap = require('enmap'), sessions = new enmap('sessions'); module.exports = (req, res, next) => { if (!req.cookies) next(); const { cookies: { session: sessionID } } = req; if (sessionID) { const session = sessions.get(sessionID); if (session) { req.session = session; } else { req.session = undefined; }; } else { req.session = undefined; }; next(); };
    
node.js express multipartform-data form-data body-parser
6个回答
18
投票
对于您正在谈论的具体情况,您通常只需要“body-parser”模块就能够访问表单输入字段。我建议您在其之上构建的最小示例如下:

var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({extended : true})); app.use(bodyParser.json()); app.get('/login', (req, res) => { /* ... */ }); app.post('/login', (req, res) => { console.log(req.body); // ... }); app.listen(3000);
所以我的建议是通过删除除 

bodyParser

 之外的任何其他中间件来缩小问题的原因。尝试一一评论,然后你就能找到罪魁祸首!

另请注意,无需费心尝试使其与 Ajax 兼容,因为这没有什么区别。保持简单,只需尝试正常的浏览器提交即可。

当发现有问题的中间件时,对其进行调试。如果是您制作的,请确保不对

req.body

 进行任何更改。如果是第三方中间件,请仔细查阅他们的安装步骤,我很高兴获得进一步的解释和支持

编辑:一些其他提示

    确保提交的请求带有标头
  • Content-Type: application/x-www-form-urlencoded
    
    
  • 检查是否有CORS问题
  • 文件上传中间件与资产一样位于单独的路径上

1
投票
从表单元素中删除

enctype="multipart/form-data"

 对我有用,在注册这些中间件之后也是如此:

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

1
投票
有时,这不起作用的要点是 - 当您在正文中传递的数据采用

text

 格式时,或者就像我在标头中的情况一样,我有 
'Content-Type': 'application/x-www-form-urlencoded'
,但您的 req.body 需要 JSON 数据 -因此,请务必仔细检查请求标头中是否设置了 
'Content-Type':'application/json'


0
投票
需要使用其他模块来处理

multipart/form-data

https://github.com/pillarjs/multiparty

app.post('/login', function (req, res) { const form = new multiparty.Form(); form.parse(req, function(err, fields, files) { console.log(fields); }); })
    

-1
投票
请使用正文解析器从表单中获取输入

var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.use(bodyParser.urlencoded({extended : true})); app.use(bodyParser.json()); app.post('/anyRoute', (req, res) => { console.log(req.body); //your input value }); app.listen(3000);
    

-1
投票
我也遇到了同样的错误,解决方法是从表单元素中删除

enctype="multipart/form-data"

。如果您没有将文件与带有 enctype 属性的表单一起发送,那么您会收到此类错误

© www.soinside.com 2019 - 2024. All rights reserved.