登录页面路由功能代码如下:
app.post(’/login’, function(req, res) { var md5 = crypto.createHash(‘md5’), password = md5.update(req.body.password).digest(‘hex’); //检查用户是否存在 User.get(req.body.name, function (err, user) { if (!user) { req.flash(‘error’, ‘用户不存在!’); return res.redirect(’/login’);//用户不存在则跳转到登录页 } //检查密码是否一致 if (user.password != password) { req.flash(‘error’, ‘密码错误!’); return res.redirect(’/login’);//密码错误则跳转到登录页 } //用户名密码都匹配后,将用户信息存入 session req.session.user = user; req.flash(‘success’, ‘登陆成功!’); res.redirect(’/index’);//登陆成功后跳转到主页 }); });
登录时,会自动跳到错误页面。控制面板会打印出 POST /p_login 500 86.077 ms - 660
后来在调试时,发现是在这个路由规则里面获取不到req.body等参数。console.log(req.body.name)会打印出来undefined。 但是有安装body-parser中间件,并且在app.js页面里面有引入border.parser如下:
var bodyParser = require(‘body-parser’);
app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false }));
求解!以上错误是怎样造成的,还有怎样才能获取到req.body参数。 搜索了好多文章,也没有找到解决问题的方法,真心求解!谢谢各位。
- 首先Chrome调试工具看client发送请求的header里body是否和预期一样
- 要是和预期一样, inspect req看看 req里到底是什么(理论上client正常的话, req里肯定有bod信息)
- 要是req里也有的话, 那可能就是body-parser工作不正常了
@lanhaoxiang 不一定非要是json, 楼主用form-urlencoded并没有问题
@zoran-hwang 比如我登录facebook的请求 请求中会带有FormData 检验前台提交Form是否正确
@brickyang 这个是原始的前端表单代码
<form class="form-horizontal" method="POST" action="/p_login">
<div class="form-group-lg">
<label for="inputEmail3" class="col-sm-2 control-label">邮箱</label>
<div class="col-sm-10">
<input type="email" class="form-control" id="inputEmail3" placeholder="Email" autocomplete="off">
</div>
</div>
<div class="form-group-lg">
<label for="inputPassword3" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" class="form-control" id="inputPassword3" placeholder="Password" autocomplete="off">
</div>
</div>
<div class="form-group-lg">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" class="btn btn-success btn-lg" value="登录"/>
</div>
</div>
</form>
里面div之类都是加样式的。下面这是去除样式之后的表单代码。
<form class="form-horizontal" method="POST" action="/p_login">
<input type="email" class="form-control" id="inputEmail3" placeholder="Email" autocomplete="off">
<input type="password" class="form-control" id="inputPassword3" placeholder="Password" autocomplete="off">
<input type="submit" class="btn btn-success btn-lg" value="登录"/>
</form>
这是处理路由的代码
app.post('/p_login', function(req, res) {
var md5 = crypto.createHash('md5'),
password = md5.update(req.body.password).digest('hex');
//检查用户是否存在
User.get(req.body.name, function (err, user) {
if (!user) {
req.flash('error', '用户不存在!');
return res.redirect('/p_login');//用户不存在则跳转到登录页
}
//检查密码是否一致
if (user.password != password) {
req.flash('error', '密码错误!');
return res.redirect('/p_login');//密码错误则跳转到登录页
}
req.session.user = user;
req.flash('success', '登陆成功!');
res.redirect('/');
});
});