Nodejs回调函数中如何根据条件循环查找相同sql数据库?或者说Nodejs回调函数怎样实现无限次递归调用?

Nodejs回调函数中如何根据条件循环查找相同sql数据库?或者说Nodejs回调函数怎样实现无限次递归调用?

请看下面代码逻辑,问题在下面代码的中文里。真心求教!

function GetRandomNum(Min,Max)
{
    var Range = Max - Min;
    var Rand = Math.random();
    return(Min + Math.round(Rand * Range));
}

Member.get_user_code = function(callback){
    var user_code= GetRandomNum(100,100000000);
    Member.get(user_code,function(err,member){
        if(err)throw err;
        if(member){
            user_code= GetRandomNum(100,100000000);
            //这里需要实现重新生成user_code并执行检查数据库,直到检查到数据库中不存在该user_code为止,请问这里的逻辑怎么实现?
            //或者说如何循环执行Member.get函数直到此函数返回值为null为止呢?
            ......
        }
        callback(user_code);
    });
}

Member.get = function(user_code,callback){
    var member = null;
    mysql.connection(function(connection){
        connection.query('select * from members where user_code=?',user_code,function(err, results, fields){
            if(results && results.length > 0){
                member = new Member(results[0]);
            }
            callback(err,member);
        });
    });
}

3 回复

为了实现你所描述的需求,即在Node.js中通过回调函数不断生成新的user_code并检查数据库直到找到一个未被使用的user_code,我们可以使用递归的方式来处理这个问题。递归在这里是一种合适的方法,因为它允许我们重复执行某个过程,直到满足特定条件为止。

下面是修改后的代码:

function GetRandomNum(Min, Max) {
    var Range = Max - Min;
    var Rand = Math.random();
    return (Min + Math.round(Rand * Range));
}

Member.get_user_code = function (callback) {
    function generateUserCode() {
        var user_code = GetRandomNum(100, 100000000);

        Member.get(user_code, function (err, member) {
            if (err) throw err;

            if (!member) {  // 如果数据库中没有找到对应的user_code,则返回
                callback(user_code);
            } else {  // 否则继续生成新的user_code
                generateUserCode();
            }
        });
    }

    generateUserCode();  // 初始调用
};

Member.get = function (user_code, callback) {
    var member = null;
    mysql.connection(function (connection) {
        connection.query('SELECT * FROM members WHERE user_code=?', user_code, function (err, results, fields) {
            if (results && results.length > 0) {
                member = new Member(results[0]);
            }
            callback(err, member);
        });
    });
};

解释

  1. 生成新user_code:我们定义了一个内部函数generateUserCode(),它首先生成一个新的user_code
  2. 检查数据库:然后调用Member.get()来检查这个user_code是否已经存在于数据库中。
  3. 递归调用
    • 如果数据库中没有找到该user_code(即membernull),则直接回调传入的callback函数,并传递生成的user_code
    • 如果找到了对应的user_code,则递归地再次调用generateUserCode(),直到找到一个未被使用的user_code为止。

这种方法避免了无限递归,因为每次递归调用都是基于一个新的随机生成的user_code,最终会达到停止条件。


自己搞定了,参考了async库的whilst函数写法,改后如下:

function GetRandomNum(Min,Max)
{
    var Range = Max - Min;
    var Rand = Math.random();
    return(Min + Math.round(Rand * Range));
}
function check(err, member,uc, callback){//把判断逻辑整理为函数
    if(err) throw err;
    if(!member){//直到member为空为止,执行Member.get_user_code的callback
        callback(uc);
    }else{
        uc = GetRandomNum(100,100000000);
        Member.get(uc,check, callback);//再次回调Member.get
    }
}
Member.get_user_code = function(callback){
    var uc = 5919211;//GetRandomNum(100,100000000);
    Member.get(uc, check, callback);
}
Member.get = function (user_code, callback, callback2){//传送两个函数,第一个用来传check函数,第二个传Member.get_user_code的callback
    mysql.connection(function(connection){
        connection.query(
            'SELECT * FROM members where user_code = ?', user_code,
            function selectCb(err, results, fields) {
                if (err) {
                    throw err;
                }
                connection.end();
                var member = null;
                if(results && results.length > 0){
                    member = new Member(results[0]);
                }
                callback(err,member, user_code,callback2);
            }
        );
    });
};

最后在调用的方法是:

Member.get_user_code(function(uc){
    ......
});

在这个问题中,我们需要在一个Node.js回调函数中循环查找一个SQL数据库,直到找到一个不存在的user_code。这可以通过递归调用来实现。

解释

为了实现这个功能,我们需要在get_user_code函数中使用递归调用。当发现已经存在的user_code时,我们将再次生成一个新的user_code并重复调用Member.get函数。这样可以确保我们最终会找到一个不存在的user_code

示例代码

const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'testdb'
});

connection.connect();

function GetRandomNum(Min, Max) {
    var Range = Max - Min;
    var Rand = Math.random();
    return (Min + Math.round(Rand * Range));
}

function Member() {}

Member.get = function (user_code, callback) {
    connection.query('SELECT * FROM members WHERE user_code=?', [user_code], function (err, results) {
        if (err) return callback(err);
        if (results.length > 0) {
            callback(null, results[0]);
        } else {
            callback(null, null);
        }
    });
};

Member.get_user_code = function (callback) {
    const generateUserCode = () => {
        let user_code = GetRandomNum(100, 100000000);
        Member.get(user_code, (err, member) => {
            if (err) throw err;

            if (!member) {
                // 如果user_code不存在,则直接返回
                return callback(user_code);
            }

            // 如果user_code存在,则递归调用
            generateUserCode();
        });
    };

    generateUserCode();
};

// 调用示例
Member.get_user_code((user_code) => {
    console.log("Generated unique user code:", user_code);
});

解释

  1. generateUserCode 函数负责生成随机的user_code并查询数据库。
  2. 如果查询结果为空(即没有找到该user_code),则直接返回该user_code
  3. 如果查询结果不为空,则递归调用generateUserCode函数,继续生成新的user_code

这种方法通过递归来实现了循环查找数据库的功能,直到找到一个不存在的user_code为止。

回到顶部