我正在开发一个项目,我必须为用户创建团队,但在此之前我需要检查该团队名称是否已被同一用户占用。下面是示例代码
var mysql=require('../../config/mysql_connect.js');
var dateFormat = require('dateformat');
var functions={
createTeam:function(data,cb){
this.checkifExists(data,function(err,result){
if(err)
{
cb(err);
}
else
{
if(result.length)
{
cb(null,0); // Team name exists
}
else
{
mysql.getConnectionFromPool(function(err,con){
if(err)
{
cb(err);
}
else
{
var query=con.query("Insert into team SET ? ",data,function(err,result){
if(err)
{
cb(err);
}
else
{
cb(null,result.insertId);
}
con.release();
});
}
});
}
}
});
},
checkifExists:function(data,cb){
mysql.getConnectionFromPool(function(err,con){
if(err)
{
cb(err);
}
else
{
var sql="Select id from team where user_id = ? and team_name like "+ con.escape('%'+data.team_name+'%') ;
var query=con.query(sql,[data.user_id,data.team_name],function(err,result){
if(err)
{
cb(err);
}
else
{
cb(null,result);
}
con.release();
});
console.log(query.sql);
}
});
}
};
module.exports=functions;
一切正常,但有没有更简单的方法可以以更易于管理的方式编写这个可靠的查询,因为有时会有超过 3-4 个查询,代码会变得复杂且难以管理。
我知道通过 mysql 唯一索引可以实现同样的效果,但如果有超过 3-4 个查询,并且在某些情况下索引不能满足我的需求,该怎么办
最佳答案
据我所知,有两个问题。
- 您不能将事务与非托管池连接一起使用,因为为一个连接启动的事务无法传递给其他连接。
- 您获取并释放每个函数的连接。没有必要重复代码。
要解决这些问题,您可以通过实体使用单独的连接,例如一个连接用于团队
,第二个连接用于用户
等等。为了避免回调 hell ,请使用async
模块或promise。
这是草稿
// db.js
var mysql=require('../../config/mysql_connect.js');
var connections = {};
// No, that code don't solve problems, because transaction can't started inside other.
// Block mechanism by transaction property `is_busy` seems a bulky.
function DB(name) {
if (!name)
// unnamed connection. Must be released on query end.
return mysql.getConnectionFromPool();
if (!connections[name])
// create always open connection
connections[name] = mysql.getConnectionFromPool();
return connections[name];
}
module.exports = DB;
// team.js
var dateFormat = require('dateformat');
var async = require('async');
var db = require('db')('team'); // get always-open connection for team-entity from pool
function create (data, cb) {
// Here async is not necessary but used as example
async.waterfall([
function(cb) {
isExists(data.user_id, data.team_name, cb);
},
function(isTeamExists, cb) {
if (!isTeamExists)
return cb(); // go to end of waterfall
// is a bad statement; use enum of fields
db.query('insert into team SET ?', data, cb);
}],
// end waterfall chain
function(err, team_id) {
if (err)
return cb(err); // pass error to original cb-func
...do-smth and call cb without error...
}
);
}
function isExists (user_id, team_name, cb) {
// You can use ?? to masked input
db.query('select 1 from team where user_id = ?? and team_name like "%??%"',
[user_id, team_name],
function(err, res) {
cb(err, !err && res.length > 0);
}
);
}
module.exports = {
create,
isExists
};
关于mysql - 在nodejs中执行多个可靠的mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435056/