Nodejs sql模块及模块化思想

在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;

  

   

原文地址:https://www.cnblogs.com/potato-lee/p/6247930.html