如何向 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 站点添加代理?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongodb、node.js、express 和 EJS 创建动态站点地图?