使用express框架,提交登录注册页面,路由里面获取不到req.body等参数
发布于 8 年前 作者 zoran-hwang 7155 次浏览 来自 问答

登录页面路由功能代码如下:

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参数。 搜索了好多文章,也没有找到解决问题的方法,真心求解!谢谢各位。

24 回复

req.body[‘password’]这样试试

@Baozhejun 试过了,还是undefined。获取不到值。

还能咋地, vscode调试调起来

@Smallpath 这是个调试node的工具吗?

@zoran-hwang visual studio code, 最强大的功能之一就是node.js调试了

@Smallpath 哦哦,这样啊。我去试试

用 Chrome F12 检查一下 http 请求看看

@brickyang 只能看出来状态吗是500,再看不出来其他什么了

@zoran-hwang 看 request,不是 response

{ extended: false }去掉试试

  1. 首先Chrome调试工具看client发送请求的header里body是否和预期一样
  2. 要是和预期一样, inspect req看看 req里到底是什么(理论上client正常的话, req里肯定有bod信息)
  3. 要是req里也有的话, 那可能就是body-parser工作不正常了

@Kaijun error.PNG

麻烦你帮忙看一下,没看出来造成的。

下面这张是可以正常请求得其他页面的截图

ok.PNG

您说得header里面的body是否与预期一样不知道怎么去查看,只能看到请求头里的content-length为0.

contentType:'json’ 纠正:@Kaijun 楼下说的没错, 楼主的问题应该是表单里面没有name='name’的元素,建议楼主贴出Form Data

@lanhaoxiang 不一定非要是json, 楼主用form-urlencoded并没有问题

@zoran-hwang 比如我登录facebook的请求 1.pic.jpg 请求中会带有FormData 检验前台提交Form是否正确

贴前端代码

前端代码 有没有 name=‘name’ name='password’这个玩意儿。

@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('/');
    });
});

@doerU 18楼有贴的代码,没有你说的name=‘name’,name='password’这些

<input type="email" class="form-control" id="inputEmail3" placeholder="Email" autocomplete="off">

里加上 name="email" 试试,密码字段同理

然后在服务端打印一下 req.body 看看

@brickyang 我试了下 成功了 原来req.body解析的是传递过来的name属性。 真的谢谢你。

@doerU 恩恩,问题已经解决,就是你说的没有加name属性,谢谢你。

req.body 里面内容是前端请求的一些具体内容

@zoran-hwang 最近没逛 社区,多做做就知道了,不用谢。

回到顶部