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 に答える