前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >nodejs操作mysql数据库

nodejs操作mysql数据库

作者头像
OECOM
发布2020-07-01 17:14:26
2.1K0
发布2020-07-01 17:14:26
举报
文章被收录于专栏:OECOM

nodejs是一个运行在服务器端的JavaScript框架,既然是在服务器端运行,就少不了需要操作数据库。在nodejs中提供了一个基本的mysql模块,同时本示例也采用mysql作为例子。

首先要做的就是安装mysql模块

代码语言:javascript
复制
npm install mysql -S

然后就是先创建一个数据库,名字暂时起为:nodejs,然后在里面新建一张表,表名为user,表结构如下图所示

user表结构
user表结构

至此,准备工作已经完成。接下来要做的就是在程序里进行配置,链接数据库,封装操作方法。

首先,新建一个mysql.js文件

代码语言:javascript
复制
var mysql = require('mysql');
var config = require('./config');
var pool = mysql.createPool({
    host: config.mysqlHost,
    user: config.mysqlUser,
    password: config.mysqlPassword,
    database: config.mysqlDatabase,
    port: config.mysqlPort,
    charset:"UTF8MB4_GENERAL_CI"
});

我这里的配置信息写在了一个配置文件里,里面报错了数据库主机密码相关信息。在上面的代码示例中我们已经完成了数据库链接池的配置,接下来进行方法的封装

代码语言:javascript
复制
/读查询
exports.query = function query(sql, callback){

    pool.getConnection(function(err, conn){
        if(err){
            callback(err, null, null);
        }else{
            conn.query(sql, function(qerr, vals, fields){
                conn.release();//释放连接
                callback(qerr, vals, fields); //事件驱动回调
            });
        }
    });
};

这是一个简单的方法封装,用于查询使用,因为查询基本上不涉及到数据库事务,所以不存在数据回滚的现象,我们再来看一下基本的使用情况。比如一个简单的登录吧:

代码语言:javascript
复制
router.get('/login',function (req,res){
var response = {
            success:false,
            errormsg:"查询失败"
        }
try{
        var params = url.parse(req.url, true).query;
        var userName = params.userName;
        var password = params.password;

        var pattern = /["'=]+/;
        if(pattern.test(userName)){
        //在这里进行非法共计的校验,以防sql注入
            response.errormsg = "非法攻击";
            res.json(response);
        }
        var sql = 'select * from user where userName = "'+userName+'" and password="'+password+'"';
        console.log(sql);
        mysql.query(sql,function(err,result,fildes){
            if(err){
                     console.log("login:" + JSON.stringify(err));
                     res.json(response);
            }else{
                console.log(result);
                 if (result.length == 0) {
                    response.errormsg = "无此人信息";
                     res.json(response);
                 }else{
                    response.success = true;
                    response.errormsg = "查询成功";
                    res.json(response);
                 }
            }
        })
    }catch(e){
        res.json(response);
    }
});

在此需要介绍一下,connection.query有两种写法,一个是上面的方法,直接写全sql语句,另一种写法是后面跟参数,比如

代码语言:javascript
复制
var modsql = 'UPDATE user SET name = ?,age = ? WHERE id = ?';
var modsqlparams = ['吕雪源love','26','1'];
connection.query(modsql,modsqlparams,function (err,result) {
//内部操作
})

个人还是比较建议将sql写全然后直接执行。具体的sql语句写法可以自己学习数据库相关的知识。之后我们说一下nodejs中事务的用法。下方示例代码还是写在了mysql.js文件中

代码语言:javascript
复制
exports.execTrans = function execTrans(sqlparamsEntities, callback) {
//sqlparamsEntities是一个数组,里面包含了需要在事务中执行的sql语句
  pool.getConnection(function (err, connection) {
    if (err) {
      return callback(err, null);
    }
    connection.beginTransaction(function (err) {
      if (err) {
        return callback(err, null);
      }
      console.log("开始执行transaction,共执行" + sqlparamsEntities.length + "条数据");
      var funcAry = [];
      sqlparamsEntities.forEach(function (sql) {
        var temp = function (cb) {
          connection.query(sql, function (tErr, rows, fields) {
            if (tErr) {
              connection.rollback(function () {
                console.log("事务失败," + sql + ",ERROR:" + tErr);
                throw tErr;
              });
            } else {
              return cb(null, 'ok');
            }
          })
        };
        funcAry.push(temp);
      });
 
      async.series(funcAry, function (err, result) {
        console.log("transaction error: " + err);
        if (err) {
          connection.rollback(function (err) {
            console.log("transaction error: " + err);
            connection.release();
            return callback(err, null);
          });
        } else {
          connection.commit(function (err, info) {
            console.log("transaction info: " + JSON.stringify(info));
            if (err) {
              console.log("执行事务失败," + err);
              connection.rollback(function (err) {
                console.log("transaction error: " + err);
                connection.release();
                return callback(err, null);
              });
            } else {
              connection.release();
              return callback(null, info);
            }
          })
        }
      })
    });
  });
}

上方的示例代码不再一一赘述,基本流程就是begin一个事务,然后开始执行,遇到错误则进行回滚操作,执行完成关闭数据库链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档