我正在使用express.js和ember over node开发一个网站。
我在ubuntu服务器上托管了我的网站,这个网站使用了一组web服务(在其他一些不同的服务器上运行)。要避免跨域问题(在从网站调用webservices时),我使用 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 方法类型的网络服务,我能够从网站成功调用所有这些网络服务。我的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方法类型 调用webservices时遇到 问题。
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类型的webservices的任何响应。如果我从以下位置替换上述API网址:
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请求。
请注意: 当我尝试使用'proxy-middleware'模块时:
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();
}
});
答案 0 :(得分: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);
答案 1 :(得分: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。但是,我不确定它是如何工作的。如果有人解释它是如何工作的原因,那就太好了。
谢谢。