在nodejs中和后台数据库连接,并进行数据库操作
1.安装mysql文件
需要先初始化nodejs,及express后,再从shell命令行里进入项目的根目录,输入....dec29>npm install mysql --save-dev回车,等待一段时间即可。
2.安装成功后
2.1 登录
在routes这个文件夹下,根据模块化的思想创建一个模块
这里的一个登录的例子和上一篇文章不同,这里讲的是用户名及密码已经存在于数据库中,第二次登录。
1>模拟这个场景,需要先在mysql中创建一个数据库dec30及一个表t_use,表中有数据,如下图所示:
2>创建初始登录界面(htmlj界面),代码如下:
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="login.do" method="post">
<label>账号:</label>
<input type="text" name="username3"/>
<label>密码:</label>
<input type="password" name="pwd3"/>
<button>提交</button>
</form>
</body>
</html>
3> 在routes文件夹下创建useModule.js文件
步骤:配置sql连接信息-->打开sql连接-->操作sql--->关闭sql
"use strict";
const mysql=require("mysql");//调用数据库模块
var useModule= {
login: function (request, response) {
let username3 = request.body.username3;
let pwd3 = request.body.pwd3;
console.log(request.body);
//配置数据库的连接信息
const myconn = mysql.createConnection({//定义了一个数据库的对象myconn
host: "localhost",//连接数据库所在的主机名,本地的就是localhost。其他的给指定的ip地址
user: "root",//数据库连接中的账号名
password: "root",//数据库连接中的密码
port: "3306",//这是和数据库连接的端口,是数据库开启时的端口号,默认3306;如果设置了就是设置了的端口号
database: "dec30"//这是要在哪一个数据库中查找数据的
});
//console.log(myconn);
myconn.connect();//连接数据库
myconn.query("select * from t_use where U_name=? and U_pwd=?",[username3,pwd3],function(err,data){
//从数据库中查询数据,其中的?代表占位符。第一个参数是sql语句,第二个参数为一个数组,sql的查询参数,第三个是返回的结果。err是错误结果的集合,
//data是正确结果的集合。如果这里的where语句使用U_name="admin" and U_pwd="123"会造成密码泄露,同时也会造成无密码登录成功,这里使用?占位符,避免了此。
console.log(err);
console.log(data);
if(data!=undefined&&data.length>0){
response.redirect("main.html")//登录成功后的跳转到的页面
}else{ response.send("您输入的账号、密码有误,请重新输入!") } });
//**insert这段代码激活后,和前面的query响应头冲突了
myconn.query("insert into t_use (U_name,U_pwd)values(?,?)",[username3,pwd3],function(err,data){
if(data!=undefined&&data.length>0){
response.redirect("main.html")//登录成功后跳转的页面
}else{ response.send("您输入的数据有误!") } });
myconn.end();//关闭数据库连接,一定要有这句,不然会造成数据库崩溃
module.exports=useModule;//将这个useModule这个模块文件公开
4>login这模块创建好后,需要在app.js主文件中调用这个模块,代码如下:
app1.post("/login.do",useModule.login);
//这里不能设置成login(),加()代表执行函数,这里是需要将login给post作为调用函数;同时前面的“/login.do”拦截与html界面中的action一样
//至于什么时候调用,是在当请求来的时候才调用
到这里,这个登录模块就创建好了。
2.2 数据库sql封装
1>根据我们上面创建的登录连接数据库的模块化思想,可以将数据库这块的配置,操作封装起来,方便调用。在routes文件夹下新建一个js文件,用于sql封装,我创建的为dbconfig.js,代码如下:
/**
* Created by Administrator on 2017/1/3.
*/
"use strict";
const mysql=require("mysql");
const mydb={
myconfig:{
//配置数据库信息,写在getconnectionSql外面,可以更换数据库,方便代码维护,也是对外提供了一个控制
host:'localhost',
user:'root',
password:'root',
port:'3306',
database:'dec30'
},
getconnectionSql:function(sql,arr,fn){
//创建连接一定要写在这个函数里面,不然会造成登录成功后,页面返回继续重新登录就无法登录;
//this指的是myconfig这个配置,createConnection是sql默认的一个封装函数
let mysqlconnection=mysql.createConnection(this.myconfig);
mysqlconnection.connect();
mysqlconnection.query(sql,arr,fn);
mysqlconnection.end();
}
};
module.exports=mydb;
2>在useMdoule.js文件里的写法根据sql的封装,如下:
"use strict";
const dbconfig =require("./dbconfig.js");
var useModule= {
login: function (request, response) {
let username3 = request.body.username3;
let pwd3 = request.body.pwd3;
console.log(request.body);
let sql="select * from t_use where U_name=? and U_pwd=?";
dbconfig.getconnectionSql(sql,[username3,pwd3],function(err,data){
if(data!=undefined&&data.length>0){
response.redirect("main.html")
}else{
response.send("您输入的账号、密码有误,请重新输入!")
}
})
},
reg:function(request,response){//注册的功能
let sql="insert into t_use values(?,?)";
dbconfig.getconnectionSql(sql,[111,222],function(err,data){
})
}
};
module.exports=useModule;