0

我正在使用 express.js 和 ember over node 开发一个网站。

我在 ubuntu 服务器上托管了我的网站,并且该网站使用了一组 web 服务(它们在其他一些不同的服务器上运行)。为避免跨域问题(从网站调用 web 服务时),我使用http-proxy如下

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var httpProxy = require('http-proxy');
var endpoint  = {
    host:   'WEBSERVICES_HOSTED_IP_ADDRESS',
    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.bodyParser());
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);
    }
});

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'));
});

我有几个具有 GET方法类型的 Web 服务,并且能够从网站成功调用所有这些 Web 服务。我的 AJAX 代码(用于 GET)如下:

        $.ajax({
            type: 'GET',
            async: false,
            url: '/api/{API_NAME}',
            success: function (data) {
               alert("success");
            },
            failure: function(error){
                alert("failure");
            }
        });

因此,上面的http-proxy代码成功处理了我所有的 web 服务(使用 GET 方法类型)。但是,我在使用 POST 方法类型调用 Web 服务时遇到问题

AJAX 代码(POST)如下:

$.ajax({
    type: "POST",
    dataType: "json",
    url: "/api/{API_NAME}",
    data: requestData,
    async: false,
    success: function(data,status, jqXHR) {
        alert('success');
    },
    error: function (xhr, ajaxOptions   , thrownError){
        alert('failure');
    }
});

我没有为 POST 类型的 Web 服务检索任何响应。如果我将上述 API URL 替换为:

url: "/api/{API_NAME}"

url: "http://www.apiwebsite.com/api/{API_NAME}"

我可以在浏览器控制台中查看 API 的响应。但是我无法在 AJAX 代码中处理此响应。显示失败警报框(我的 AJAX 代码的失败块)。

控制台日志:

 XMLHttpRequest cannot load http://www.apiwebsite.com/api/{API_NAME}. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. 

因此我觉得,我必须编写一些代码来通过 http-proxy 处理这些 POST 请求和响应。任何人都可以请指导我。

我在https://github.com/nodejitsu/node-http-proxy/issues/180中发现了类似的问题。但是,我无法成功发出 POST 请求。

请注意:当我尝试使用“代理中间件”模块时:

var proxyFunc = proxy(url.parse('http://www.apiwebsite.com'))
app.use(function (req, res, next) {
    if(req.url.match(/^\/api/)) { // 'yoursite.com/api' --> 'apiwebsite.com/api'
        proxyFunc(req, res, next);
    } else {  // other routes
        next();
    }
});
4

2 回答 2

1

像这样使用proxy-middleware

var express = require('express')
, url = require('url')
, proxy = require('proxy-middleware');

var app = express();
app.use('/api', proxy(url.parse('https://damphat.com/')));
app.listen(80);

在您的浏览器上测试此代理:

编辑:

var express = require('express')
, url = require('url')
, proxy = require('proxy-middleware');

var app = express();

var proxyFunc = proxy(url.parse('http://apiwebsite.com/api'))
app.use(function (req, res, next) {
    if(req.url.match(/^\/api/)) { // 'yoursite.com/api' --> 'apiwebsite.com/api'
        proxyFunc(req, res, next);
    } else {  // other routes
        next();
    }
});

app.listen(80);
于 2014-01-06T08:38:49.973 回答
0

我已通过对应用设置代码进行小幅更改来解决此问题:

var express = require('express');
var routes = require('./routes');
var http = require('http');
var path = require('path');
var httpProxy = require('http-proxy');
var endpoint  = {
    host:   'WEBSERVICES_HOSTED_IP_ADDRESS',
    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.use(express.bodyParser());

以下

app.use(function(req, res) {
    if (req.url.indexOf(endpoint.prefix) === 0) {
        proxy.proxyRequest(req, res, endpoint);
    }
});

现在,带有 POST 和 GET 请求的 API 已成功发出。但是,我不确定它是如何工作的。如果有人解释它的工作原理,那就太好了。

谢谢你。

于 2014-01-15T06:00:03.683 回答