如何向 Node / Express 站点添加代理?

Posted

技术标签:

【中文标题】如何向 Node / Express 站点添加代理?【英文标题】:How to add proxy to Node / Express site? 【发布时间】:2011-10-01 09:08:08 【问题描述】:

我的网站在 Node 上运行并使用 Express 框架。

我的目标是从 Yahoo Placefinder api 收集数据。它不支持 JSONP,所以我需要将我的 JQuery.getJSON 请求发送到我自己的代理。然后我的代理会向 Placefinder api 发送一个 http 请求,并回显响应。

如果我使用 php 而不是 Node,我只需创建一个新的 php 文件,其中包含对 placefinder api 的 curl 请求并回显响应。

但是,我正在使用 Node,我不知道从哪里开始。

而且,我正在使用 Express 框架。

我的问题是:

    代理适合 Express 框架的什么位置?公用文件夹?

    在哪里可以找到有关如何在 Node 中编写代理代码的信息?

    我是否需要修改我的 Rackspace 云 (ubuntu) 服务器的配置才能做到这一点?

【问题讨论】:

【参考方案1】:

    见node-http-proxy。它应该比实现自己的代理更好。

    Express 允许您在执行express.createServer() 时添加中间件作为参数。或者,您可以在之后使用 .use(proxy) 添加它们。

    我不这么认为。

举个例子(未经测试的代码):

var httpProxy = require('http-proxy'), express = require('express');
var yahooProxy = httpProxy.createServer(80, 'yahoo.com');
var app = express.createServer();
app.configure(function () 
    app.use('/yahoo', yahooProxy);
);

...

【讨论】:

我猜这是做事的最佳实践方式......但我不知道如何让它发挥作用。 在此过程中您将如何更改 URL? @barum-rho 例如,我试图代理 facebook 照片,这些照片位于不同的主机名(例如 http://a4.sphotos.ak.fbcdn.net/)。试图找出一种将整个 URL 传递给 http-proxy 的方法,其 URL 类似于 /proxy?src=http://a4.sphotos.ak.fbcdn.net/.../proxy/http://a4.sphotos.ak.fbcdn.net/... @AidanFeldman 查看 http-proxy 的 GitHub 存储库。第二个示例将通过一些修改来完成您想要做的事情。 (github.com/nodejitsu/node-http-proxy) 在“使用自定义服务器逻辑设置独立代理服务器”下。【参考方案2】:

这是另一个演示标头注入的 1.0.X 示例。

var express = require( 'express' );
var proxy   = require( 'http-proxy' ).createProxyServer;
var app     = express();

app.configure(function() 

  // Inject some request headers here before we proxy...
  app.use( function( req, res, next ) 
    req.headers[ 'x-my-header' ] = 'blah blah';
    next();
  );

  // Proxy based on path...
  app.use( '/stack', proxy( target: 'http://***.com' ).web );
  app.use( '/yahoo', proxy( target: 'http://yahoo.com' ).web );

  app.use( function( req, res ) 
    res.send( ok: false, message: 'Not much here.' )
  );

).listen( 3000 );

【讨论】:

【参考方案3】:

您可以将另一条路线添加到您的 express 应用中,可能是 /api/yahoo/...

然后,此视图函数将调用 Yahoo API,可能使用:http://nodejs.org/docs/v0.4.9/api/http.html#http.request,然后当该请求完成时,您只需将结果返回为 JSON。

但是,请记住,您的代理是公开的,任何人都可以通过它提出请求。我会建议一些基本的授权。您向发出请求的页面提供的生成值应该可以工作。

【讨论】:

我正在尝试设置它,但收到错误“ENOTFOUND,未找到域名”。这是我的 express app.js 中的相关代码:jsfiddle.net/4J3Wd 任何想法我做错了什么? 搞定了。我的错误是在 .get() 选项对象的主机值中包含“http://”。这是工作版本:jsfiddle.net/4J3Wd/1 你能告诉我更多关于如何设置基本授权的信息吗? 当然。当您呈现您计划从中发出 API 请求的页面时,生成代码(将其保存在用户的会话中),并将其作为 js 变量发送到页面。当页面需要点击您的/api/yahoo 链接时,将生成的值包含为请求参数。在您的/api/yahoo 视图中,根据用户会话中的请求参数检查请求参数;如果匹配,则通过请求。【参考方案4】:

将 http-proxy 1.0 与 express 一起使用:

var httpProxy = require('http-proxy');

var apiProxy = httProxy.createProxyServer();

app.get("/api/*", function(req, res) 
  apiProxy.web(req, res,  target: 'http://google.com:80' );
);

【讨论】:

【参考方案5】:

如今,这似乎是向 Express 添加代理的最简单解决方案: https://www.npmjs.org/package/proxy-middleware

【讨论】:

以上是关于如何向 Node / Express 站点添加代理?的主要内容,如果未能解决你的问题,请参考以下文章

向 node express 添加新路由

如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?

如何在 Node 中为 websocket 做代理

node.js 与 express 如何从 url 中删除查询字符串

nodejs 代理 解决开发环境跨域问题

如何添加node express 为windows 启动服务器