mysql - 在nodejs中执行多个可靠的mysql查询

标签 mysql node.js

我正在开发一个项目,我必须为用户创建团队,但在此之前我需要检查该团队名称是否已被同一用户占用。下面是示例代码

 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 个查询,并且在某些情况下索引不能满足我的需求,该怎么办

最佳答案

据我所知,有两个问题。

  1. 您不能将事务与非托管池连接一起使用,因为为一个连接启动的事务无法传递给其他连接。
  2. 您获取并释放每个函数的连接。没有必要重复代码。

要解决这些问题,您可以通过实体使用单独的连接,例如一个连接用于团队,第二个连接用于用户等等。为了避免回调 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/

相关文章:

MYSQL select查询,同一列必须存在多个条件

mysql - 如何向已有主键的表添加更多数据?

mysql 计算其他表的行数并在 where 中使用它

node.js - 如何在环回中将模型设置为变量?

node.js - AVA 测试设置 : "Unexpected token export"

javascript - 服务器端 JavaScript (node.js) 中的帐户

PHP读取数据库中的字段

PHP - 如果发生错误,发送电子邮件

javascript - Bcrypt 比较密码时给出 false

node.js - node js mongodb数据库连接报错连接服务器失败