Node.js Express req.body为空

Node.js Express req.body为空,node.js,express,multipartform-data,form-data,body-parser,Node.js,Express,Multipartform Data,Form Data,Body Parser,我已经尝试了许多StackOverflow答案,这种方法通常使用body解析器工作,但是我在使用AJAX或表单数据从req.body获取任何输出时遇到了问题 在server.js中: app.use(helmet());//头盔中间件 app.use('/assets',express.static('resources/web/assets');//公开资产 app.use(require('./resources/modules/session.js'));//自定义会话中间件 app.se

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

server.js
中:

app.use(helmet());//头盔中间件
app.use('/assets',express.static('resources/web/assets');//公开资产
app.use(require('./resources/modules/session.js'));//自定义会话中间件
app.set('view engine','ejs');//将EJS设置为视图引擎
app.set('views',`${dirname}/resources/web/pages`);//设置“视图”文件夹
app.use(cookieParser());//cookie解析器中间件
app.use(bodyParser.urlencoded({extended:true}));//用于处理编码数据的主体解析器中间件
app.use(bodyParser.json());//用于处理JSON的主体解析器中间件
使用(文件上传({limits:{fileSize:100*1024*1024}}));//快速文件上传中间件(bushboy包装器)
app.use('/api',require('./resources/routes/api.js');//外部API路由器
// ...
app.post('/login',(req,res)=>{
控制台日志(请求主体);
res.render('login'{
配置,
第页:{
名称:“登录”
},
错误:“”
});
res.end();
});
我的
login.ejs
code:


登录
无论我尝试什么,我总是在控制台中得到一个空的
{}
,但没有效果。我试过调试;我需要一双新的眼睛来看看我做错了什么。 以下是表格数据: 我也尝试过使用jQuery的AJAX(
$.get
):

$.post(“”,{用户名:'test',密码:'test'})
.fail(控制台错误)
.done(()=>console.log('Success');

编辑:在尝试multer的
app.use(require('multer')().array()之后
app.use(require('multer')().none())中间件,除了
multer
req.body
现在是
未定义的
,而不是
{}
。这是因为数据以
application/x-www-form-urlencoded
的形式发送,而不是我以前认为的
application/formdata
。在这种情况下,主体解析器中间件方法应该可以工作。如果有贡献,请不要提供与解析
应用程序/表单数据相关的答案

编辑2:对于那些需要
session.js
code的人,这里是:

const enmap=require('enmap'),
会话=新的enmap(“会话”);
module.exports=(请求、恢复、下一步)=>{
如果(!req.cookies)next();
const{cookies:{session:sessionID}}=req;
if(sessionID){
const session=sessions.get(sessionID);
国际单项体育联合会(届会){
req.session=会话;
}否则{
req.session=未定义;
};
}否则{
req.session=未定义;
};
next();
};

我附上了所有的源代码,因为你们声称能够以某种方式复制它。请在(DM me on Discord,如果它不工作-PiggyPlex#9993)下载它。

您需要使用其他模块来处理
多部分/表单数据

app.post('/login',函数(req,res){
const form=new multiparty.form();
解析(请求、函数(错误、字段、文件){
console.log(字段);
});
})

对于您正在讨论的特定情况,通常只需要“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
进行任何更改。如果它是第三方中间件,那么请非常仔细地参考他们的安装步骤,我很高兴得到进一步的解释和支持

编辑:一些其他提示

  • 确保提交请求时带有标题
    内容类型: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);

我想你指的是
多部分/表单数据
,而不是
表单/数据
…通常情况下,这应该是可行的。我假设你已经完成了下一步的步骤,但是我仍然想说:1。请求头(内容类型)是否正确发送-检查网络选项卡?2.尝试使用javascript获取而不是jquery的Post3。最后,试着像Postman一样点击API客户机的请求,看看行为是否相同。可能会帮助您进一步缩小问题范围。我已检查网络选项卡并尝试失眠。我已运行您的代码,它对我有效。请您发布
/resources/modules/session.js
的代码好吗?甚至我也尝试过粘贴在这里的相同代码,并使用postman、Ajax和jQuery进行了测试。这个问题应该在之前的一个中间程序中解决,试着把你的路线排好,一行接一行,你最终会认出有罪的人!谢谢-我发现正如你们中的许多人所指出的,这是一些狡猾的会话代码@PiggyPlex很高兴听到这个消息!如果您觉得这个答案有用,请将其标记为解决方案。