首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在node.js上设置代理

无法在node.js上设置代理
EN

Stack Overflow用户
提问于 2015-10-05 15:38:46
回答 2查看 1.8K关注 0票数 1

端口5550上有node.js 4.1.1和express.js 4.8.5。我在8080端口上还有Geoserver 2.8.0。两台服务器都在同一台笔记本上。

节点上的一个应用程序想从Geoserver访问一些地图数据,下面是openlayers的详细信息。

代码语言:javascript
复制
 source: new ol.source.TileWMS({
      url: 'http://localhost:8080/geoserver/mymap/wms?',
      crossOrigin: 'anonymous',
// I also tried  crossOrigin: 'localhost:8080/' and crossOrigin: 'localhost:5550/' but nothing

       params: {'LAYERS': 'mymap:layer, mymap:anotherLayer, FORMAT': 'image/png' ,'CRS': 'EPSG:3857'},
       serverType: 'geoserver'

在Geoserver上设置CORS或proxy是不可能导致技术问题的(旧Jetty核心、旧Jetty版本的hack-ish解决方案,无法使用的jars )。为了避免CORS和Access Control Allow Origins错误,我想在Node上设置一个代理。我只想使用Node,因为它更容易设置。

根据和前面的问题这里,我必须设置一个反向代理,所以

  • 我不做代理向客户吐露
  • Geoserver通过Node反向代理提供服务,因此看起来它们具有相同的起源(=不再存在CORS问题)。
  • 客户端希望访问Geoserver,但是通过Node进行访问时并不知道。

我想我的概念是正确的,但我不知道如何实现这个概念。我选择了http-代理中间件来做这个。我在我的app.js上添加了

代码语言:javascript
复制
var proxyMiddleware = require('http-proxy-middleware'); 

    var proxy = proxyMiddleware('http://localhost:8080/geoserver', {
                    target: 'http://localhost:5550',
                    changeOrigin: true   
                });

var app = express();

app.use('/' , function (req, res) {
       res.render('index', { title: 'testing', head: 'Welcome Testing Area'});
    });

app.use(proxy); 
app.listen(5550);

在控制台上我看到了[HPM] Proxy created: /geoserver -> http://localhost:5550

但我还是得到了错误Image from origin 'http://localhost:8080' has been blocked from loading by Cross-Origin Resource Sharing policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5550' is therefore not allowed access. The response had HTTP status code 404.

我不明白如何实现这一点。请指出我的错误或如果我没有正确的概念。请帮我理解一下。

谢谢

更新

这些是打开浏览器控制台时看到的标题

代码语言:javascript
复制
General
Remote Address:[::1]:8080
Request URL:http://localhost:8080/geoserver/mymap/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&FORMAT=image%2Fpng&TRANSPARENT=true&LAYERS=mymap%3Aplanet_osm_polygon%2C%20mymap%3Aplanet_osm_line%2C%20mymap%3Aplanet_osm_roads%2C%20mymap%3Aplanet_osm_point&TILED=true&CRS=EPSG%3A3857&WIDTH=256&HEIGHT=256&STYLES=&BBOX=2269873.9919565953%2C4618019.500877209%2C2348145.508920616%2C4696291.017841229
Request Method:GET
Status Code:404 Not Found

Response Headers
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=iso-8859-1
Content-Length: 1408
Server: Jetty(6.1.8)

Request Headers
Accept:image/webp,image/*,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:el-GR,el;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:8080
Origin:http://localhost:5550
Referer:http://localhost:5550/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
EN

回答 2

Stack Overflow用户

发布于 2015-10-05 19:18:24

看来你把代理配置错了。

  • 混合使用常规代理配置和速记配置
  • 目标应该是Geoserver,而不是您的快速服务器。

以Geoserver为目标的正常语法:

代码语言:javascript
复制
var proxy = proxyMiddleware('/geoserver', {
                 target: 'http://localhost:8080',
                 changeOrigin: true   
            });

或者用速记语法:

此配置与前一配置完全相同。

代码语言:javascript
复制
var proxy = proxyMiddleware('http://localhost:8080/geoserver', {
                 changeOrigin: true   
            });
票数 2
EN

Stack Overflow用户

发布于 2015-10-07 22:28:20

木井是对的。最后对我起作用的是设置http-proxy-middleware

在我的app.js

代码语言:javascript
复制
var proxyMiddleware = require('http-proxy-middleware'); 

var proxy = proxyMiddleware('http://localhost:5550', {
                 target: 'http://localhost:8080',
                 changeOrigin: true,
                 xfwd: true
            });

/*
the above can be replaced by chimurai's version : 
var proxy = proxyMiddleware('/geoserver', {
                 target: 'http://localhost:8080',
                 changeOrigin: true   
            });
and will still work
*/

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());

app.use(express.static(path.join(__dirname, 'public')));

app.use('/', function(req, res, next) {
    httpProxy.createProxyServer({target:'http://localhost:8080'});
    next();
});

app.use(proxy);

app.listen(5550);

我在Open层代码中删除了这个crossOrigin: 'anonymous',,并在Openlayers中的链接上修正了一个错误,现在可以正常工作了。

我还试图通过在Geoserver上设置一个代理来修复这个问题,但这是不可能的,因为Geoserver运行的是一个旧的Jetty版本,现在是EOL,因此没有官方解决方案来代理Geoserver或升级它。

通过Node进行故障排除是最好的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32952476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档