2013-04-04 38 views
0

我已经得到了相当愚蠢的问题,我试图使用基于MongoDB的距离被拉条件的node.js进行重定向服务......这样的代码lookis这样的:Node.js的其他函数内部异步调用

var http = require('http'), 
util = require('util'), 
url = require('url'); 

var server = http.createServer(function(req, res) { 
    domain = req.headers['host']; 
    var url = getRedirect(domain); 

    res.writeHead(301, { 'Location': url}); 
    res.end(); 
}); 

server.listen(8080); 

var getRedirect = function(domain) { 

    Domain.findOne({ 'name': domain }, 'url', function (err, domain) { 
     if (err) return handleError(err); 
     console.log('redirect url %s.', domain.url) 
     return domain.url 
    }) 
} 

当然 - 因为它应该是不工作,因为Domain.findOne找到延迟的结果,并且返回不分配resuluts到url ...我试图通过“res”对象到getRedirect函数,但我很确定这是错误的。

任何线索?

回答

2

您需要为此使用回调,因为(正如您指出的那样),域/ url获取是异步的。节点约定是使用“错误优先回调”签名。

试试这个:

var http = require('http'), 
    util = require('util'), 
    url = require('url'); 

var server = http.createServer(function(req, res) { 
    var domain = req.headers['host']; 
    // provide a callback to getRedirect so we can get the value asynchronously 
    getRedirect(domain, function(err, url) { 
     if (err) return handleError(err); 
     res.writeHead(301, { 'Location': url }); 
     res.end(); 
    }); 
}); 

server.listen(8080); 

var getRedirect = function(domain, cb) { 
    Domain.findOne({ 'name': domain }, 'url', function (err, domain) { 
     if (err) return cb(err); 
     console.log('redirect url %s.', domain.url); 
     // instead of returning, pass the result to the callback 
     cb(null, domain.url); 
    }); 
}; 
0

我用async.series但我您的解决方案看起来更好

async.series([ 
    function (callback) { 
     Domain.findOne({ 'name': domain }, 'url', function (err, domain) { 
      if (err) return handleError(err); 
      console.log('looking for domain' + domain); 
      callback(null, domain.url); 
     }) 
    } 
    ], function (err, results) { 
     res.writeHead(301, { 'Location': results[0]}); 
     res.end(); 
});