CNode

使用express框架,提交登录注册页面,路由里面获取不到req.body等参数

问答
Zzoran-hwang发布于10 年前最后回复10 年前24 回复8241 浏览0 收藏

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

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)

B
Baozhejun#1·10 年前

req.body['password']这样试试

Z
zoran-hwang#2·10 年前
引用 Baozhejunreq.body['password']这样试试

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

S
Smallpath#3·10 年前

还能咋地, vscode调试调起来

Z
zoran-hwang#4·10 年前
引用 Smallpath还能咋地, vscode调试调起来

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

S
Smallpath#5·10 年前
引用 zoran-hwang@Smallpath 这是个调试node的工具吗?

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

B
brickyang#7·10 年前

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

Z
zoran-hwang#8·10 年前
引用 brickyang用 Chrome F12 检查一下 http 请求看看

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

D
dd0754#10·10 年前

{ extended: false }去掉试试

K
Kaijun#11·10 年前
  1. 首先Chrome调试工具看client发送请求的header里body是否和预期一样
  2. 要是和预期一样, inspect req看看 req里到底是什么(理论上client正常的话, req里肯定有bod信息)
  3. 要是req里也有的话, 那可能就是body-parser工作不正常了
Z
zoran-hwang#12·10 年前
引用 dd0754{ extended: false }去掉试试

@dd0754 还是不行

Z
zoran-hwang#13·10 年前
引用 Kaijun1. 首先Chrome调试工具看client发送请求的header里body是否和预期一样 2. 要是和预期一样, inspect req看看 req里到底是什么(理论上client正常的话,...

@Kaijun error.PNG

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

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

ok.PNG

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

L
lanhaoxiang#14·10 年前

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

K
Kaijun#15·10 年前

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

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

B
brickyang#16·10 年前

贴前端代码

D
doerU#17·10 年前

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

Z
zoran-hwang#18·10 年前
引用 brickyang贴前端代码

@brickyang 这个是原始的前端表单代码

			<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('/');
    });
});
Z
zoran-hwang#19·10 年前
引用 doerU前端代码 有没有 name='name' name='password'这个玩意儿。

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

B
brickyang#20·10 年前

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

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

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

Z
zoran-hwang#21·10 年前
引用 brickyang在 <input type="email" class="form control" id="inputEmail3" placeholder="Email" autocomplete="of...

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

Z
zoran-hwang#22·10 年前
引用 doerU前端代码 有没有 name='name' name='password'这个玩意儿。

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

Y
yujintang#23·10 年前

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

D
doerU#24·10 年前

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

参与回复
登录后即可参与回复。登录