0

我有一些非常愚蠢的问题,我正在尝试根据从 mongodb 中提取的条件使用 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 正在寻找延迟的结果,并且 return 不会将结果分配给 url ......我试图将“res”对象传递给 getRedirect 函数但我很漂亮肯定是错的。

有什么线索吗?

4

2 回答 2

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);
    });
};
于 2013-04-04T03:20:04.817 回答
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();
});
于 2013-04-04T03:33:34.087 回答