Nodejs 第一次写,调用 async.waterfall 里进行 mysql 嵌套循环查询,callback is not a function,有偿咨询……

发布于 1周前 作者 htzhanglong 来自 nodejs/Nestjs

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&lt;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&lt;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);
    });

};


11 回复

用 es6 的 async 和 await 啊 ,不要用这个


纠正楼上,async await 属于 es7.
升级 nodejs 到 8 LTS 以上,支持 async await 写法,谁写谁怀孕

干嘛不用 async/await,这个看着就蛋疼…

第一个函数
function(eigencode,callback)
改成
function(callback)

还有空格 tab 混用。。。

其实 es6 的 Promise 也可以了解一下。。。

感谢!不报错了; 其实一开始只看了 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 查询,并避免这个错误。

首先,确保你已经安装了 mysqlasync 包:

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

如果需要更具体的帮助,请提供更多代码细节。

回到顶部