nodejs是一个运行在服务器端的JavaScript框架,既然是在服务器端运行,就少不了需要操作数据库。在nodejs中提供了一个基本的mysql模块,同时本示例也采用mysql作为例子。
首先要做的就是安装mysql模块
npm install mysql -S
然后就是先创建一个数据库,名字暂时起为:nodejs,然后在里面新建一张表,表名为user,表结构如下图所示
至此,准备工作已经完成。接下来要做的就是在程序里进行配置,链接数据库,封装操作方法。
首先,新建一个mysql.js文件
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"
});
我这里的配置信息写在了一个配置文件里,里面报错了数据库主机密码相关信息。在上面的代码示例中我们已经完成了数据库链接池的配置,接下来进行方法的封装
/读查询
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); //事件驱动回调
});
}
});
};
这是一个简单的方法封装,用于查询使用,因为查询基本上不涉及到数据库事务,所以不存在数据回滚的现象,我们再来看一下基本的使用情况。比如一个简单的登录吧:
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语句,另一种写法是后面跟参数,比如
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文件中
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一个事务,然后开始执行,遇到错误则进行回滚操作,执行完成关闭数据库链接。