zoukankan      html  css  js  c++  java
  • 关于nodejs访问mysql的思考

    nodejs要访问mysql数据库,首先必须要安装包mysql,命令:npm install mysql。安装成功后的访问数据库代码如下:

    var mysql = require('mysql');
    var options = {
        host: '172.23.88.107',
        port: 3306,
        database: 'test',
        user: 'root',
        password: 'zdsoft'
    };
    
    var pool = mysql.createPool(options);
    
    pool.getConnection(function (err, conn) {
        if (err) {
            console.log(err);//打印错误消息
        } else {
            conn.query("select * from student", null, function (err, results, fields) {
                //释放连接
                conn.release();
    
                if (err) {
                    console.log(err);
                } else {
                    console.log(results);//成功,打印结果集
                }
            })
        }
    });

    ok,上面的代码经过测试是没有任何问题的,但是现在就有个问题了,我们每次访问数据库都写这么大一篇感觉太累了,于是我们想把公共的部分提取出来创建一个类,文件名为:sqlHelper.js。由于数据库访问是异步访问的,因此我们不能直接通过返回return的方式,因此就必须要使用回调函数,sqlHelper.js的代码如下:

    var mysql = require('mysql');
    var options = {
        host: '172.23.88.107',
        port: 3306,
        database: 'test',
        user: 'root',
        password: 'zdsoft'
    };
    
    var pool = mysql.createPool(options);
    
    exports.query = function (sql, vals, fn) {
        pool.getConnection(function (err, conn) {
            if (err) {
                fn(new Error(err));
            } else {
                conn.query(sql, null, function (err, results, fields) {
                    //释放连接
                    conn.release();
    
                    if (err) {
                        fn(new Error(err));
                    } else {
                        fn(null, results, fields);
                    }
                })
            }
        });
    }

    这样,我们在调用的时候直接传入fn这个回调函数即可,调用方法如下:

    var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面
    
    var result = mysql.query("select * from student", null, function (err, results, fields) {
        if (results) {
            for (let index = 0; index < results.length; index++) {
                console.log(results[index].name);
            }
        } else {
            console.log("err,msg:" + err);
        }
    });

    自此,我们也算是大功告成了。

    ================================================分割线===========================================================

    然而,我们还有另外一种实现方式,就是通过Promise这个对象,通过Promise对象我们可以像编写同步程序一样去编写异步代码,从而不用去无限次的嵌套回调函数,sqlHelper.js修改如下:

    var mysql = require('mysql');
    var options = {
        host: '172.23.88.107',
        port: 3306,
        database: 'test',
        user: 'root',
        password: 'zdsoft'
    };
    
    var pool = mysql.createPool(options);
    
    exports.query = function (sql) {
        return new Promise(function (resolve, reject) {
            pool.getConnection(function (err, conn) {
                if (err) {
                    reject(err);//让状态变为已失效,并把错误消息传递回去
                } else {
                    conn.query(sql, null, function (err, results, fields) {
                        //释放连接
                        conn.release();
    
                        if (err) {
                            reject(err);
                        } else {
                            resolve(results, fields);//让状态变为已成功,并把成功数据传递回去
                        }
                    })
                }
            });
        });
    }

    调用方法修改如下:

    var mysql = require('./lib/sqlHelper.js');//sqlHelper.js文件在lib文件夹下面
    
    var promise = mysql.query("select * from student");
    promise.then(function (results, fields) {
        for (let index = 0; index < results.length; index++) {
            console.log(results[index].name);
        }
    }, function (err) {
        console.log(err);
    });

    可以看到,我们已经没有使用回调函数了。

  • 相关阅读:
    git命令使用方法
    git与svn对比
    浏览器缓存原理
    网络性能优化常用方法
    sass/scss 和 less的区别
    AngularJS和ReactJS对比
    让IE6,7,8支持HTML5新标签的方法
    Retina 屏移动设备 1px解决方案
    HttpClient学习
    国家二字码对照表
  • 原文地址:https://www.cnblogs.com/duanjt/p/8718151.html
Copyright © 2011-2022 走看看