Express req.body 为空

Pig*_*lex 3 multipartform-data form-data node.js express body-parser

我已经尝试了许多 StackOverflow 答案,这种方法通常使用 body-parser 工作,但是我一直在req.body使用 AJAX 或表单数据获取任何输出时遇到问题。

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();
});
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

无论我尝试什么,我总是{}在控制台中得到一个空的无济于事。我试过调试;我需要一双新的眼睛才能看到我做错了什么。这是表单数据: 表单数据 我也尝试过使用 jQuery 的 AJAX( $.get):

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

在此处输入图片说明

编辑:在尝试了 multerapp.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();
};
Run Code Online (Sandbox Code Playgroud)

我附上了整个源代码,因为你们声称能够以某种方式重现它。在https://dropfile.nl/get/F7KF下载它(如果它不起作用,在 Discord 上私信我 - PiggyPlex#9993)。

Mou*_*eer 9

对于您正在谈论的特定情况,您通常只需要“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);
Run Code Online (Sandbox Code Playgroud)

所以我的建议是通过删除除bodyParser. 试着一一评论,你就能找到罪魁祸首!

另请注意,无需费心尝试使其与 Ajax 一起工作,因为它没有任何区别。保持简单,只需尝试正常的浏览器提交即可。

当您发现有问题的中间件时,对其进行调试。如果它是由您制作的,请确保您不对req.body. 如果是第三方中间件,请非常仔细地查阅他们的安装步骤,我很乐意提供进一步的解释和支持

编辑:其他一些提示

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