之前的思路是页面获取登录名和密码之后,利用Ajax请求传输数据,然后在路由处理里面利用SQL获取数据库数据,进行校验之后利用res.redirect()进行跳转,但是一直出错,出现了好几个问题,下面讲述问题和原因。
1.首先Ajax一般只是用来传输数据,不是用于进行页面跳转
因为Ajax使用之后他是一个完整的一个请求和回调的过程,在这个过程里面只存在一个HTTP表头,如果你重定向就会重复,就会报错。使用Ajax就是在同一个界面的东西,不能重定向到其他界面就打破Ajax的整个请求过程,因为redirect这个函数改变的是Ajax请求中间的定向,这就打破了Ajax整个流程。
所以如果你想做一个登陆界面,那么只有Ajax返回打开下一步的url,然后前端进行调转吧。或者不用Ajax。
2.报错Can’t set headers after they are sent.
例如我在路由处理时候这么写:
// 登陆信息验证
router.all('/test1',function (req,res,next) {
//接收传输过来的邮箱和密码
var username = req.query.username;
var password = req.query.password;
// username 和 password 都是string类型
console.log('a '+typeof(username));
console.log('b '+ password);
// 连接数据库
var connection = mysql.createConnection({ //创建mysql实例
host:'127.0.0.1',
port:'3306',
user:'root',
password:'',
database:'test'
});
connection.connect();
var sql = 'SELECT passwd FROM users where username = ' + username ;
connection.query(sql, function (err,result) {
var result1 = result[0].passwd;
console.log('3'+result1) // 输出3123
if(err){
res.send(500);
console.log('[SELECT ERROR]:',err.message);
}
else{
if(password == result1){
//登陆成功,进行页面的跳转
console.log("登陆成功");
res.send(200);
}else{
res.send(404);
console.log("密码错误");
};
}
});
connection.end();
return res.send(username);
});
就会报错:Can’t set headers after they are sent.
,测试了下不能使用多个res.send(),但是按照网上