Node.js + Express – 在完成之前返回未定义的callback

所以我在这方面遇到了很多麻烦 – 一直困住它好几个星期。

我的第一个函数查询MySQL数据库并返回一个响应,然后在我的第二个函数中处理。

问题是,JS是单线程的,我不知道如何让它以我想要的顺序运行:

  1. 函数1被触发。
  2. 该函数获取数据库响应,然后进行处理。
  3. 应答交给function2,然后进行更多的处理。

但是目前,程序直接跳转到第二个函数,而不允许查询时间,函数最终返回'undefined'。

var test = functionOne (functionTwo); console.log(test); //returning 'undefined' function functionOne(callback) { //QUERY TAKES A LONG TIME client.query("[QUERY]", function(err, result) { callback(null, result); }); } function functionTwo(err, result) { //More processing - slightly slow return result; } 

编辑:

这是完整的文件。

  var client = require('./dbHelper'); var convert = require('./genGIF'); var exportPPM = require('./makePPM'); var fs = require('fs'); module.exports = function() { var test = queryDatabase (handleResult); console.log("print: " + test); } function queryDatabase(callback) { //Query our database client.query("SHOW TABLES FROM mathsDB", function(err, result) { if (err) { callback(err); } else { //Calculate the length of our table and then the last image in the table var currentImage = result[result.length - 1]["Tables_in_mathsDB"]; currentImage = currentImage.substring(5); callback(null, currentImage); console.log(currentImage); } }); } function handleResult(err, currentImage) { fs.stat("./img/image" + currentImage + ".gif", function(err, stat) { if (err==null) { var imageFile = "/img/image" + currentImage + ".gif"; return imageFile; } else { //Check if we have a .PPM file made for the image instead, then generate a .GIF fs.stat("./img/image" + currentImage + ".ppm", function(err, stat) { if (err==null) { convert.convert("image" + currentImage); var imageFile = "/img/image" + currentImage + ".gif"; return imageFile; } else { //Generate the .GIF if no .GIF or .PPM already. exportPPM.make(); convert.convert("image" + currentImage); var imageFile = "/img/image" + currentImage + ".gif"; return imageFile; } }); } }); } 

这应该工作:

  //start execution functionOne (functionTwo); function functionOne(callback) { //QUERY TAKES A LONG TIME client.query("[QUERY]", function(err, result) { callback(null, result); }); } function functionTwo(err, result) { //call function done after long processing is finished with result done(err,result); } function done(err,result){ //do your final processing here console.log(result); } 

您将返回结果作为callback的第一个参数,但应该是第二个参数 – 换句话说,您将使用结果填充err参数,因此参数result将始终undefined

所以改变:

 function functionOne(callback) { //QUERY TAKES A LONG TIME client.query("[QUERY]", function(err, result) { callback(result); }); } 

对此:

 function functionOne(callback) { //QUERY TAKES A LONG TIME client.query("[QUERY]", function(err, result) { callback(null, result); // pass it as the second argument }); } 

这应该可以解决你的问题。

只是改变

 client.query("[QUERY]", function(err, result) { callback(null, result); }); 

至 :

 client.query("[QUERY]", function(err, result) { if( err) return callback(err); return callback(null, result); });