2013-05-04 67 views
2

我似乎无法得到最后一个回调(注释为“可选回调”)调用将结果发送回浏览器。任何指针,我做错了什么?我使用以下模块:异步,的RESTify和PostgreSQL为node.js的最后回调没有被异步调用

console.log('Start'); 

var async = require('async'); 
var restify = require('restify'); 
var server = restify.createServer(); 
server.use(restify.bodyParser()); 

server.get('/user/creationdate/:username', function(req, res, next) { 
    var userName = req.params.username; 
    var record; 

    async.parallel([ 
     function(callback){ 
      getUserByName(userName, function(err, user) { 
       if (err) return callback(err); 
       record = user; 
      }); 
     } 
    ], 
// optional callback 
     function(err){ 
      console.log('5. Following record has been retrieved:' + record); 
      res.send(record); 
     }); 

    next(); 
}); 

server.listen(8080, function() { 
    console.log('%s listening at %s', server.name, server.url); 
}); 

handleError = function handleError(err) { 
    if(!err) { return false; } 
    else { 
     console.log('The following error occurred:' + err); 

    } 
    return true; 
}; 

function getPgClient(){ 
    var pg = require('pg'); 

    var client = new pg.Client({ 
     user: 'postgres', 
     password: 'password', 
     database: 'foobar', 
     host: '192.168.1.100', 
     port: 5432 
    }); 

    client.on('drain', client.end.bind(client)); //disconnect client when all queries are finished 

    return client; 
} 

function getUserByName(userName, callback){ 
    var client = getPgClient(); 
    console.log('2. Trying to connect to DB'); 

    client.connect(function(err) { 
     console.log('3. Error connecting to DB:' + handleError(err)); 
     if(handleError(err)) return callback(err); 

     client.query("SELECT created_at FROM users WHERE username='" + userName + "'", function(err, result) { 
      if(handleError(err)) return; 
      console.log('4. Error occurred:' + err); 
      console.log(result); 
      console.log(callback); 
      callback(null, result); 
     }) 
    }); 
} 

回答

4

我不确定为什么你使用async,因为你只调用一个异步函数。但回调不叫的原因是因为你没有通过调用其回调结束的第一功能:

async.parallel([ 
    function(callback) { 
    getUserByName(userName, function(err, user) { 
     // call async callback with err and user 
     callback(err, user); 
    }); 
    } 
], function(err, record) { 
    console.log('5. Following record has been retrieved:' + record); 
    res.send(record); 
}); 

或者更短:

async.parallel([ 
    function(callback) { 
    getUserByName(callback); 
    } 
], function(err, record) { 
    console.log('5. Following record has been retrieved:' + record); 
    res.send(record); 
}); 

或者说,在这种情况下,即使较短(并且不需要async):

getUserByName(function(err, record) { 
    // handle error, or ... 
    console.log('5. Following record has been retrieved:' + record); 
    res.send(record); 
}); 
+0

已经看到了我的错误并得出了相同的结论。尽管我会给你答案的信贷。我现在只是原型,但在这个例子中确实没有用于异步。 – 2013-05-04 19:14:08

0

看到了我的错误,遗漏,我应该已经回到了回调,如行:

async.parallel([ 
    function(callback){ 
     getUserByName(userName, function(err, user) { 
      if (err) return callback(err); 
      record = user; 
      return callback(null, record); 
     }); 
    }