Node.js 从运行在代理后面的网站访问Web服务

Node.js 从运行在代理后面的网站访问Web服务,node.js,ember.js,proxy,node-http-proxy,webproxy,Node.js,Ember.js,Proxy,Node Http Proxy,Webproxy,我正在设计一个网站使用余烬和快报超过节点。它在服务器上运行,比如说:server_1 我在另一台服务器上运行的Web服务很少,比如说:Server2 即: 服务器1中的网站和服务器2中可用的Web服务 服务器_1位于代理服务器后面。我正在尝试从服务器1访问Web服务: SERVER_1 =====[PROXY]===> SERVER_2 当我从服务器1调用AJAX webservice时,我收到: NetworkError: 500 Internal Server Error 但是,我

我正在设计一个网站使用余烬和快报超过节点。它在服务器上运行,比如说:server_1

我在另一台服务器上运行的Web服务很少,比如说:Server2

即:

服务器1中的网站和服务器2中可用的Web服务

服务器_1位于代理服务器后面。我正在尝试从服务器1访问Web服务:

SERVER_1 =====[PROXY]===> SERVER_2
当我从服务器1调用AJAX webservice时,我收到:

NetworkError: 500 Internal Server Error
但是,我能够通过浏览器成功地检索值。仅通过AJAX代码,我检索网络500错误

为了进行测试,我删除了代理服务器设置:

SERVER_1 =====> SERVER_2
我能够通过AJAX代码和浏览器成功地访问所有这些web服务

如果它们之间有代理服务器:

SERVER_1 =====[PROXY]===> SERVER_2
我收到--NetworkError:500内部服务器错误

我想知道从运行在代理服务器后面的网站访问第三方Web服务的过程?

其他信息:

为了解决跨域web服务访问问题(网站运行在一台服务器上,web服务运行在其他一些具有不同端口的不同服务器上),我正在使用http代理npm,我的代码如下:

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var httpProxy = require('http-proxy');
var endpoint  = {
    host:   'IP_ADDRESS_WHERE_MY_WEBSERVICES_RUN',
    port:   80,
    prefix: '/api'
}

var proxy = new httpProxy.RoutingProxy();
var app = express();

app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.cookieParser('xxxxx'));
app.use(express.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(function(req, res) {
    if (req.url.indexOf(endpoint.prefix) === 0) {
        proxy.proxyRequest(req, res, endpoint);
    }
});
app.use(express.bodyParser());

if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}
app.get('/', routes.index);

http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});
我的AJAX调用:

$.ajax({
            type: 'GET',
            async: false,
            url: 'API_URL',
            success: function (data) {
                alert('success');
            },
            failure: function(error){
                alert('error');
            }
        });
我已经使用http代理来处理所有url的请求了

如何在上面的代码中配置代理服务器的IP地址和端口,以便成功访问所有这些Web服务?或者是否有某种方法可以在AJAX调用中使用我的代理配置

谁能给我指路吗


谢谢

通常您需要同时执行以下两项操作:

npm配置设置代理您的代理地址:端口
npm config set registry“”

一般来说,我建议您尝试通过进一步隔离问题来解决此问题

仍然有太多的开放变量。您的请求是真的通过代理传递,还是在代理中消亡?如果它离开了代理-为什么不只构建[proxy]->Server2

我有一种直觉,问题出在代理转发的(丢失的)头中的某个地方。例如,这个“NetworkError:500”是由PHP服务器在发送输出时进程死亡时创建的。可能您在Server2中触发了一个bug,因为您的代理输出与Server1输出不同


只需将代理的输出与Server1的输出进行比较(
nc
是您的朋友)。希望这能有所帮助。

如果孙子在这条线上,他会告诉你正确的策略不会首先处于这种位置。由于端口443通常在所有公司网络上都是开放的,因此允许HTTPS流量考虑创建一个服务器(使用某人的)云提供某处并在端口443上进行。您甚至可以使用此技术为开发目的创建自己的代理(请参见Squid)——这样您至少可以看到代理日志


您试图同时解决两个问题—一个是联网,另一个是您正在编写的代码。这样做意味着你一次只需要解决一个问题,而这两个问题都不会阻碍你的进步

我发现,我的代理路由API URL在这里引起了麻烦。我的代理服务器阻止所有这些路由URL

由于我无法在代理服务器后面找到路由代理API调用的答案,我做了一个临时修补程序,如下所示:

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var httpProxy = require('http-proxy');
var endpoint  = {
    host:   'IP_ADDRESS_WHERE_MY_WEBSERVICES_RUN',
    port:   80,
    prefix: '/api'
}

var proxy = new httpProxy.RoutingProxy();
var app = express();

app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.methodOverride());
app.use(express.cookieParser('xxxxx'));
app.use(express.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(function(req, res) {
    if (req.url.indexOf(endpoint.prefix) === 0) {
        proxy.proxyRequest(req, res, endpoint);
    }
});
app.use(express.bodyParser());

if ('development' == app.get('env')) {
    app.use(express.errorHandler());
}
app.get('/', routes.index);

http.createServer(app).listen(app.get('port'), function(){
    console.log('Express server listening on port ' + app.get('port'));
});
从app server中删除了现有的代理路由代码(我以前使用它来解决跨域AJAX问题):

现在,我的AJAX调用将是:

        $.ajax({
            type: 'GET',
            async: false,
            url: 'FULL_API_URL', 
            success: function (data) {
                alert('success');
            },
            failure: function(error){
                alert('error');
            }
        });
为了处理AJAX调用中的跨域问题,我做了一个服务器端修复,在服务器的所有API响应中添加了“Access Control Allow Origin”头

其他一些信息: 如果有人在AJAX中遇到跨域问题时要求使用IE8和IE9浏览器,请参阅:


谢谢你

如何使用?Node.js中的许多对象不会抛出错误,而是发出
error
事件。只需收听错误事件,并将其记录到控制台中,这样我们就可以知道发生了什么。我尝试使用转发代理。然而,这对我没有帮助。您能指导我吗?设置NPM配置与您的问题无关。据我所知,您有一个本地服务器S1,该服务器正试图在代理服务器后面访问外部URL S2:[S1]========[proxy]====>[S2],您使用的库是从S1请求S2吗?除非您直接从Ajax浏览器使用REST Web服务?谢谢您的回复。。我在S1中使用http和http代理库来访问Web服务(在S2中运行)。你是对的,S1在代理服务器后面。如果删除此代理服务器,则可以成功访问Web服务。代码在“附加信息”部分中提供。我的问题是,当我有一个代理服务器。。我在访问Web服务时遇到问题。我尝试了这两种。。然而,这并没有起到任何作用。如前所述,我可以安装所有npm软件包(这意味着我的节点服务器可以连接到internet并下载所有软件包)。然而,如果我调用公司代理背后的第三方Web服务,我会遇到这样的错误。所以我觉得我的网站节点设置中应该有一些代码(包括代理IP和端口)。。您能进一步指导我吗?如果所有其他操作都失败,您可以始终将主机作为一个整体配置为使用代理服务器。它是windows还是linux主机?您应该首先确保代理确实是您的问题,首先登录到(节点服务器)主机,并使用traceroute到您尝试使用的Web服务的地址,应该向您显示数据包在网络上的停止位置。wget--proxy user=USERNAME--proxy password=password。将允许您直接尝试从代理访问端点。等待回答的时候,达伦·怀特。我已经编辑了我的问题。你能提供你的想法吗?你需要执行我建议的网络命令。你不是在沙箱里工作——正如其他人所说