node.js带http代理的异步代理请求

node.js带http代理的异步代理请求,node.js,mongodb,http-proxy,Node.js,Mongodb,Http Proxy,我绝望了。我想,这不是什么大问题,但我找不到问题所在。 我认为,最好的是,当我发布我的课程并描述问题时,我得到了答案。我精简了功能,所以我所做的大部分看起来都是无用的,但是相信我,没有精简的代码,它是有用的:) 一切正常,很好,而不是一点,我在课后描述 首先,我的main.js,这是我的起点 var proxy = require('./proxy'); var mongo = require('mongodb'); var mongoserver = new mongo.Server('loc

我绝望了。我想,这不是什么大问题,但我找不到问题所在。 我认为,最好的是,当我发布我的课程并描述问题时,我得到了答案。我精简了功能,所以我所做的大部分看起来都是无用的,但是相信我,没有精简的代码,它是有用的:)

一切正常,很好,而不是一点,我在课后描述

首先,我的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);
    };
};
所以,当我第一次查询代理时,浏览器只是挂起,直到他抛出一个超时。句柄()在//标记1处调用 当我再次查询时,当在//标记2处调用handle()时,一切正常

我调试了,我能够调试的,进入http代理,到http,但没有找到问题。希望代码足以重演我的问题


A、 忘了。。。。当我在proxy.js中调用proxyRequest()时,没有将其委托给proxyhandler.js,即使在//Marker 1,一切都正常。

我假设
handers
在发布问题时只是一个输入错误?在初始化时,
Handler
类是否可能执行一些异步操作?比如异步初始化?我认为问题可能出在
//通常这是由“item”
代码设置的。好的,解决了--忘记缓冲数据/结束事件,如http代理包中的示例“潜在代理”。很抱歉,您可以回答自己的问题并接受它。需要缓冲的请求请参阅此线程: