Nodejs 第一次写,调用 async.waterfall 里进行 mysql 嵌套循环查询,callback is not a function,有偿咨询……
Nodejs 第一次写,调用 async.waterfall 里进行 mysql 嵌套循环查询,callback is not a function,有偿咨询……
总是提示 callback is not a function …… 难道回调格式错了?
主要想实现的逻辑是 操作 mysql 数据库,以第一次查询的结果为条件进行第二次查询,以第二次查询结果为条件进行第三次查询。
promobonus= function (eigencode, callback){
async.waterfall([
function(eigencode,callback){
pool.query(sql+"promocode = ?",[eigencode+''],function(err,subresult1){
if(err || subresult1.length<1){
err='sql first level quering erro or result is null';
} else {
};
console.log('1 '+typeof(callback));
callback(err,subresult1);
});
},function(subresult1,callback) {
var sqlele=[],eigenele=[];
for(var x of subresult1){
sqlele.push("promocode= ? OR");
eigenele.push(x.eigencode);
};
var sqltmp=sqlele.join(' ');
var sqlnew=sql+sqltmp.substring(0,sqltmp.length-2);
pool.query(sqlnew,[eigenele+''],function(err,subresult2){
if(err || subresult2.length<1){
err='sql second level quering erro or result is null';
} else {
};
console.log('2 '+typeof(callback));
callback(err,subresult2);
});
},function(subresult2,callback){
var sqlele2=[],eigenele2=[];
for(var y of subresult2){
sqlele2.push("promocode= ? OR");
eigenele2.push(y.eigencode);
};
var sqltmp2=sqlele2.join(' ');
var sqlnew2=sql+sqltmp2.substring(0,sqltmp2.length-2);
pool.query(sqlnew2,[eigenele2+''],function(err,subresult3){
if(err || subresult3.length<1){
err='sql third level quering erro or result is null';
} else {
};
console.log('3 '+typeof(callback));
callback(err,subresult3);
});
}
], function (err,subresult3) {
if(err) {
console.log(err);
}
console.log('4 '+typeof(callback));
callback(err,subresult3);
});
};
纠正楼上,async await 属于 es7.
升级 nodejs 到 8 LTS 以上,支持 async await 写法,谁写谁怀孕
还有空格 tab 混用。。。
感谢!不报错了; 其实一开始只看了 js 基本语法,第一个版本是用回调嵌套写的…… 感觉写出来简直 shit 一样,改成这个 waterfall 流程控制了……
再请教一下 为什么把第一个参数 eigencode 去掉就可以了。
都 2018 了,还是直接用 asycn await 吧。。。
纠正一下,async,await 似乎属于 es2017
数据库查询,逻辑控制,分开写
数据表查询返回一个 promise,调用直接 await 就行,不用回调
写了个楼上提到的 Promise 和 async/await 的示例,希望可以带来帮助<br>// 把回调包装成 Promise<br>function run(sql, params) {<br> return new Promise(function (resolve, reject) {<br> pool.query(sql, params, function (err, data) {<br> if (err) return reject(err);<br> resolve(data);<br> });<br> })<br>}<br><br>// Promise 方式执行<br>run('SELECT * FROM .....')<br> .then(function (data) {<br> // 第一次查询以后<br> return run('SELECT * FROM ....', <a target="_blank" href="http://data.xxx" rel="nofollow noopener">data.xxx</a>);<br> })<br> .then(function (data) {<br> // 第二次查询以后<br> return run('SELECT * FROM ....', data.yyy);<br> })<br> .then(function (data) {<br> // 第三次查询以后<br> })<br> .catch(function (error) {<br> // 错误情况<br> console.log(error);<br> });<br><br>// async/await 方式<br>async function runAsync() {<br> try {<br> let result1 = await run('SELECT * FROM ....');<br> let result2 = await run('SELECT * FROM .... WHERE a = ?', <a target="_blank" href="http://result1.xxx" rel="nofollow noopener">result1.xxx</a>);<br> let result3 = await run('SELECT * FROM .... WHERE a = ?', result2.yyy);<br> } catch (error) {<br> console.log(error);<br> }<br>}<br><br>runAsync();<br><br>
个人感觉 Promise 的形式假如有中间需要跳出的逻辑的话,手动构造一堆 Promise.resolve() 然后还好多 if 判断不太方便,async/await 舒服多了
你好,
关于你在使用 Node.js 中 async.waterfall
进行 MySQL 嵌套循环查询时遇到的 callback is not a function
错误,这通常是因为在调用回调函数时参数传递不正确或者回调函数的定义缺失。以下是一个简单的示例,展示如何在 async.waterfall
中进行 MySQL 查询,并避免这个错误。
首先,确保你已经安装了 mysql
和 async
包:
npm install mysql async
然后,你可以这样写代码:
const mysql = require('mysql');
const async = require('async');
const connection = mysql.createConnection({ /* 配置你的数据库连接 */ });
async.waterfall([
function(callback) {
connection.query('SELECT * FROM table1', (err, results) => {
if (err) return callback(err);
callback(null, results);
});
},
function(results, callback) {
results.forEach(row => {
connection.query('SELECT * FROM table2 WHERE id = ?', [row.id], (err, res) => {
if (err) return callback(err);
// 处理结果
});
});
// 注意:这里需要在所有内部查询完成后调用 callback
// 可以使用计数器或 Promise.all 来确保所有查询完成
}
], function(err, result) {
if (err) throw err;
console.log(result);
connection.end();
});
注意:在第二个函数中,由于你进行了嵌套查询,需要确保在所有内部查询完成后才调用 callback
。这里示例没有处理这个逻辑,你需要使用计数器或者 Promise.all
来确保所有查询完成后再调用 callback
。
如果需要更具体的帮助,请提供更多代码细节。