节点.js + Express - 在完成之前返回未定义的回调

Node.js + Express - Callbacks returning undefined before Complete

本文关键字:返回 未定义 回调 js Express 节点      更新时间:2023-09-26

所以我遇到了真正的麻烦 - 被困了几个星期。

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

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

  1. 触发函数 1。
  2. 该函数获取数据库响应,然后进行处理。
  3. 响应被传递给函数 2,然后函数 2 执行更多处理。

然而,目前,程序直接跳转到函数二,没有时间进行查询,函数最终返回"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;
                                    }
                            });
                    }
            });
    }

您将结果作为回调的第一个参数返回,但它应该是第二个参数 - 换句话说,您正在用结果填充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
            });
}

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

这应该有效:

  //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);
  }

只是改变

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

自:

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