9

我正在使用 ember 和 express over node 设计一个网站。它在服务器中运行,例如:SERVER_1。

我在另一台服务器上运行的 web 服务很少,比如:SERVER_2。

那是:

SERVER_1 中的网站和 SERVER_2 中可用的 Web 服务

SERVER_1 位于代理服务器后面。我正在尝试从 SERVER_1 访问网络服务:

SERVER_1 =====[PROXY]===> SERVER_2

当我从 SERVER_1 进行 AJAX 网络服务调用时,我收到:

NetworkError: 500 Internal Server Error

但是,我能够通过浏览器成功检索值。仅通过 AJAX 代码,我正在检索Network 500 error

同样为了测试,我删除了我的代理服务器设置:

SERVER_1 =====> SERVER_2

我能够通过 AJAX 代码和浏览器成功访问所有这些 Web 服务。

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

SERVER_1 =====[PROXY]===> SERVER_2

我收到了——NetworkError: 500 Internal Server Error

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

附加信息:

已经修复了跨域 Web 服务访问问题(网站在一台服务器上运行,Web 服务在具有不同端口的其他一些不同服务器上运行),我正在使用http-proxy 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-proxy 来处理所有 url 的请求。

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

谁能指导我?

谢谢

4

4 回答 4

3

通常你需要做这两个:

npm config set proxy your-proxy-address:port npm config set registry " http://registry.npmjs.org/ "

于 2014-01-18T23:08:36.067 回答
2

一般来说,我建议您尝试通过更多地隔离问题来解决这个问题。

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

我有一种直觉,问题出在代理转发的(丢失的)标头中。例如,当进程在发送输出时终止时,这个“NetworkError:500”是由 PHP 服务器创建的。也许您在 Server2 中触发了一个错误,因为您的代理输出与 Server1 的输出不同?

只需将 Proxy 的输出与 Server1 的输出进行比较(nc是你的朋友)。希望这可以帮助。

于 2014-01-24T07:06:02.820 回答
2

如果孙子在这个线程上,他会告诉你正确的策略是一开始就不在这个位置上。由于端口 443 通常在所有公司网络上都是开放的,为了允许 https 流量考虑使用(某人的)云产品在某处创建服务器并在端口 443 上通过 ssh 连接到它。您甚至可以使用此技术创建自己的代理以用于开发目的(见 squidd)——这样至少你至少可以看到代理日志。

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

于 2014-01-26T12:12:09.797 回答
0

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

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

从应用服务器中删除了现有的代理路由代码(我之前用来解决跨域 AJAX 问题):

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');

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(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: 'FULL_API_URL', 
            success: function (data) {
                alert('success');
            },
            failure: function(error){
                alert('error');
            }
        });

为了处理 AJAX 调用中的跨域问题,我通过在来自服务器的所有 API 响应中添加“Access-Control-Allow-Origin”标头来进行服务器端修复。

一些附加信息:如果有人在 AJAX 中遇到跨域问题,需要 IE8 和 IE9 浏览器,请参阅: https ://github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest

谢谢你

于 2014-01-30T05:09:37.447 回答