表示req.body为空
Express req.body is empty
我已经尝试了很多 Whosebug 的答案,并且这种方法通常使用 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>
无论我尝试什么,我总是在控制台中得到一个空的 {}
,但无济于事。我试过调试;我需要一双新的眼睛,看看我做错了什么。
这是表单数据:
我也尝试过使用 jQuery 的 AJAX ($.get
):
$.post('', {username:'test', password:'test'})
.fail(console.error)
.done(() => console.log('Success'));
编辑:在尝试了 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();
};
我附上了整个源代码,因为你们声称能够以某种方式复制它。在 https://dropfile.nl/get/F7KF 下载(如果它不起作用,请在 Discord 上私信我 - PiggyPlex#9993)。
您需要使用其他模块来处理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);
});
})
对于您所谈论的具体情况,您通常只需要 '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
之外的任何其他中间件来缩小问题的原因。尝试评论他们one-by-one,然后你就能找到罪魁祸首!
另请注意,无需费心尝试使其与 Ajax 一起使用,因为它不会有任何区别。保持简单,尝试正常的浏览器提交即可。
当你发现有问题的中间件时,调试它。如果它是由您创建的,请确保您没有对 req.body
进行任何更改。如果它是第三方中间件,那么请非常仔细地参考他们的安装步骤,我很乐意提供进一步的解释和支持
编辑:其他一些提示
- 确保提交的请求带有 header
Content-Type: application/x-www-form-urlencoded
- 检查是否存在CORS问题
- 文件上传中间件与资产一样位于单独的路径上
请使用正文解析器从表单中获取输入
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);
我遇到了同样的错误,通过从表单元素中删除 enctype="multipart/form-data"
解决了这个问题。如果您没有在发送带有 enctype 属性的表单的同时发送文件,则会收到此类错误
我已经尝试了很多 Whosebug 的答案,并且这种方法通常使用 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>
无论我尝试什么,我总是在控制台中得到一个空的 {}
,但无济于事。我试过调试;我需要一双新的眼睛,看看我做错了什么。
这是表单数据:
$.get
):
$.post('', {username:'test', password:'test'})
.fail(console.error)
.done(() => console.log('Success'));
编辑:在尝试了 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();
};
我附上了整个源代码,因为你们声称能够以某种方式复制它。在 https://dropfile.nl/get/F7KF 下载(如果它不起作用,请在 Discord 上私信我 - PiggyPlex#9993)。
您需要使用其他模块来处理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);
});
})
对于您所谈论的具体情况,您通常只需要 '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
之外的任何其他中间件来缩小问题的原因。尝试评论他们one-by-one,然后你就能找到罪魁祸首!
另请注意,无需费心尝试使其与 Ajax 一起使用,因为它不会有任何区别。保持简单,尝试正常的浏览器提交即可。
当你发现有问题的中间件时,调试它。如果它是由您创建的,请确保您没有对 req.body
进行任何更改。如果它是第三方中间件,那么请非常仔细地参考他们的安装步骤,我很乐意提供进一步的解释和支持
编辑:其他一些提示
- 确保提交的请求带有 header
Content-Type: application/x-www-form-urlencoded
- 检查是否存在CORS问题
- 文件上传中间件与资产一样位于单独的路径上
请使用正文解析器从表单中获取输入
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);
我遇到了同样的错误,通过从表单元素中删除 enctype="multipart/form-data"
解决了这个问题。如果您没有在发送带有 enctype 属性的表单的同时发送文件,则会收到此类错误