leo
leo

Reputation: 21

node.js async callback error on queue.drain

I am trying to use a callback to indicate when all the async workers are complete, but I am getting the dreaded

TypeError: callback is not a function.

I would like to individually process each element in data, and on completion, have queue.drain to send the callback(data) to refresh Data on completion. I have been readying the async documentation, but clearly i am not getting something.

function refreshData(postData, callback) {

    var options = {
        host: 'www.myhost.com',
        port: 443,
        path: '/pulldata,
        method: 'POST',
        headers: {
            "Content-Type": "application/json"
        }
    };

    var req = https.request(options, function(res) {
       var headers = res.headers
       var d = '';
       res.setEncoding('utf8');
       res.on('data', function (chunk) {
           d = d + chunk;
       });
       res.on('end', function() {
           if (res.statusCode == '200') {
               data = JSON.parse(d);

                queue = async.queue(function (task, cb) {
                    processData(task,cb);
                 },1); 

                 //this is were the errors are
                 queue.drain = function() {
                    callback(data)
                  };

                 for(i=0; i<data.length; i++) {
                     queue.push(data[i],'');
                  }

            } else {
                 callback(false)
            }
        }); 

    });

    req.on('error', function(e) {
        console.log('problem with request: ' + e.message);
    });

    // write data to request body
    req.write(postData);
    req.end();  
}   

Any assistance would be greatly appreciated!

Edit, added some pseudo code to demonstrate how refreshData is being used:

Node https.createServer(req,res) {
    req.on(){
       read userData
    }
    req.end(){
        validateUser(userData, function(callbackData) {
            if(callbackData==false) {
                //bad user or error with request
                res.writeHead(404);
                res.end('bye');
             } else {
                //good user and responses
                res.writeHead(200);
                res.end(callbackData);
             }
        })
    }
}

function validateUser(userData,callback) {
     //do some stuff to validate
     if(userData is good) {
     //call refreshData if user
          refreshData(userData,callback)
     } else {
          callback(false)
     }
}

Upvotes: 2

Views: 1408

Answers (1)

anshulk
anshulk

Reputation: 458

[EDIT] Added a callback As given in the documentation you pointed to , change this line

queue.push(data[i],'');

to

queue.push(data[i], function(err){
 // handle error 
});

Try it here async-queue-callback

Upvotes: 3

Related Questions