0

私は絶望します。これは大きな問題ではないと思いますが、問題が見つかりません。クラスを投稿して問題を説明するだけで、最高だと思います。私は機能を取り除いたので、ほとんどのことは役に立たないように見えますが、私を信じてください、コードを取り除かなくても、それは役に立ちます:)

ワンポイントの代わりに、すべてが正常に機能します。クラスの後に説明します

まず、私の開始点である私の main.js

var proxy = require('./proxy');
var mongo = require('mongodb');
var mongoserver = new mongo.Server('localhost', 27017, {auto_reconnect:true});
var mongodb = new mongo.Db('proxy', mongoserver, {safe:false});
mongodb.open(function(err, db) {
    proxy.createServer(8000, db);
}

proxy.js

var httpProxy = require('./node_modules/http-proxy/lib/node-http-proxy');
var proxyhandler = require('./proxyhandler');

exports.createServer = function(port, mongodb) {
    return new Proxy(port, mongodb);
};

var Proxy = exports.Proxy = function(port, mongodb) {
    var handlers = {};
    var requestCallback = function(req, res, proxy) {
        var host = req.headers.host; //target host, find user modules by this
        if (!handlers[host]) {
            mongodb.collection('customerConfig', function(err, collection) {
                collection.findOne({host:host}, function(err, item) {
                    handlers[host] = proxyhandler.createHandler(mongodb, item);
                    handers[host].handle(req, res, proxy); //Marker 1
                });
            });
        } else {
            handers[host].handle(req, res, proxy); //Marker 2
        }
    };

    return httpProxy.createServer(requestCallback).listen(port);
};

proxyhandler.js

exports.createHandler = function (mongodb, item) {
    return new Handler(mongodb, item);
};

var Handler = function(mongodb, config) {
    this.handle = function (req, res, proxy) {
        var target = { host : 'google.de', port : 80 }; //normally this is set by "item"
        proxy.proxyRequest(req, res, target);
    };
};

そのため、初めてプロキシにクエリを実行すると、タイムアウトが発生するまでブラウザがハングします。再びクエリを実行すると、//Marker 1 で handle() が呼び出されます。//Marker 2 で handle() が呼び出されると、すべて正常に動作します。

デバッグできたものをデバッグし、http-proxy にステップインして http にアクセスしましたが、問題を見つけることができませんでした。コードが私の問題を再現するのに十分であることを願っています。

A、忘れていました....proxyhandler.jsに委譲せずにproxy.jsでproxyRequest()を呼び出すと、//Marker 1でもすべて正常に動作します。

4

0 に答える 0