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);
});
});
};
解释
- 生成新
user_code
:我们定义了一个内部函数generateUserCode()
,它首先生成一个新的user_code
。 - 检查数据库:然后调用
Member.get()
来检查这个user_code
是否已经存在于数据库中。 - 递归调用:
- 如果数据库中没有找到该
user_code
(即member
为null
),则直接回调传入的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);
});
解释
generateUserCode
函数负责生成随机的user_code
并查询数据库。- 如果查询结果为空(即没有找到该
user_code
),则直接返回该user_code
。 - 如果查询结果不为空,则递归调用
generateUserCode
函数,继续生成新的user_code
。
这种方法通过递归来实现了循环查找数据库的功能,直到找到一个不存在的user_code
为止。