这篇文章将为大家详细讲解有关如何使用node和express连接mysql实现登录注册,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
数据库我选了比较“正式”的MySQL,代码方面这个比MongoDB复杂一些。而且这是数据库课设,如果用mongodb老师肯定让我挂了,因为没有涉及到设置主键、外键等。
先在主入口js引入登录注册业务js和发起一个监听端口
var express = require('express');
var user = require('./controll/user');
var app = new express();
app.use(express.static('public')); //静态资源的入口
app.use('/user',user); //这样写是为了以后如果改变了请求路径,也不用改逻辑js而是改这行的路径即可
var server = app.listen(3000)
html
$("#signup").click(function(){
$.ajax({
url: "/user/signup",
type: 'post',
data: $("#formid").serialize(),
success: function(data) {
if(data.status == 99999) {
alert("3秒后跳转到首页");
setTimeout(function() {
location.href='http://'+window.location.host+'/html/index.html';
},3000)
}else {
alert('登录名或密码错误')
}
}
})
})
$("#register").click(function(){
$.ajax({
url: "/user/register",
type: 'post',
data: $("#formRegister").serialize(),
success: function(data) {
console.log(data);
if(data.status == 99999) {
alert("注册成功")
}else {
alert("登录名已经有人用")
}
}
})
})
user.js
var mysql = require('mysql');
var express = require('express');
var bodyParser = require('body-parser');
var cookieParser = require('cookie-parser');
var session = require('cookie-session');
function select(sql) {
var promise = new Promise(function(resolve,reject) {
var result = null;
var mysql = require('mysql');
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root'
});
connection.connect();
connection.query("USE test");
connection.query(sql, function (err, results, fields) {
if (err) {
console.log("err");
reject(err);
}else {
console.log("yes");
if(results.length > 0) {
resolve({status: 99999});
}else {
resolve({status: 00000});
}
}
}
);
connection.end();
})
return promise;
}
var router = express.Router();
router.use(bodyParser.urlencoded({ extended: true }));
router.use(cookieParser())
router.use(session({
secret: 'blog'
}))
router.use(function timeLog(req,res,next) {
var _user = req.session.user;
if(_user) {
//router.locals.user = user;
}
next();
})
//登录
router.post('/signup',function(req, res) {
var _user = req.body.user;
var name = _user.name;
var password = _user.password;
select('SELECT * FROM name WHERE name = "'+ name + '" AND password = "' + password + '";').then(function(data) {
//session存user name和userid
req.session.user = name;
data.status > 50 ? data.url = '/html/index.html' : null;
res.json(data);
res.end();
req.redirect("/");
}).catch(function(err){})
})
//注册
router.post('/register',function(req, res) {
var _user = req.body.user;
var name = _user.name;
var password = _user.password;
console.log(name+" "+password)
select('SELECT * FROM name WHERE name = "'+ name + '";')
.then(function(data) {
if(data.status == 99999) {
console.log("已有此用户名")
res.json({status:00000});
res.end();
}else {
select('INSERT INTO name(name,password) VALUES ("'+name+'", "'+password+'");')
.then(function(data) {
res.json({status:99999});
res.end();
}).catch(function(err){})
}
}).catch(function(err){
})
});
//退出
router.get("/logout",function(req, res) {
delete req.session.user;
res.end();
})
//获取session
router.get("/session",function(req, res) {
console.log("user in session");
console.log(req.session.user);
res.json({user:req.session.user});
res.end();
})
module.exports = router;
代码很多,不一一解释了,如果以后有空再补回。先说几个点
我把连接数据库的逻辑都包在了select方法里。因为最后要把查询到的结果返回回去,所以就要return,但是!!查询数据库是异步操作!!所以直接在select函数的最后一行return是没有效果的,所以就算return都要在查完后的那个回掉函数,但是在回掉函数return 的话是不能return到select函数外的。解决方案就是es6的Promise。详细的就自己学相关知识了。
拿到查询后的结果,登录与注册要分清楚逻辑,什么时候是成功的什么情况是失败的。注册这里我掉坑了。因为名不能重复,所以要先查询,如果能查到放回的是status=99999。刚开始我没理解清楚Promise,以为查询不成功就是走reject(err)其实并不是,查询不成功返回的是[],执行的还是resolve(),区分就只能看他返回来的status。
还有保存登录状态,就是session,这里我也没怎么弄懂。但是这一步可以放在router的中间件执行,这样每个经过这个router就能执行那一步了。如果存在req.session.user的时候,就把当前的locals.user赋值。
导致我注册那里摔了很久还爬不上来除了没理解清楚Promise外,还有mysql不能输入中文。当时我没有设utf8,所以一直报错,走的是reject(err)。不只只把mysql的语言设置为utf8,还要注意navcicat新建属性的时候的字符类型,不然字符冲突搞得不能插入语句成功。
关于“如何使用node和express连接mysql实现登录注册”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。