如何在 Node / Express 网站中添加代理?

3
我的网站正在使用Node并使用Express框架。
我的目标是从Yahoo Placefinder api中收集数据。它不支持JSONP,因此我需要将我的JQuery.getJSON请求发送到自己的代理。然后,我的代理将向Placefinder api发送http请求,并回显响应。
如果我使用的是php而不是Node,我只需创建一个新的php文件,其中包括对placefinder api的curl请求并回显响应。
但是,我正在使用Node,不知道从哪里开始。
而且,我正在使用Express框架。
我的问题是:
1. 代理在Express框架中应该放在哪里?公共文件夹吗? 2. 在哪里可以找到有关如何在Node中编写代理的信息? 3. 我是否需要修改我的Rackspace云(ubuntu)服务器的配置才能实现这一点?
5个回答

13
  1. 请参考node-http-proxy,使用它比自己实现代理更好。

  2. Express允许你在express.createServer()时将中间件作为参数添加。或者,你可以使用.use(proxy)之后再添加中间件。

  3. 我不这么认为。

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

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

...

我猜这是最佳实践的做法……但我不知道如何让它工作。 - edt
你会如何在处理过程中修改URL? - Aidan Feldman
例如,我试图代理 Facebook 的照片,它们位于不同的主机名下(例如 http://a4.sphotos.ak.fbcdn.net/)。我试图找出一种方法,将整个 URL 传递给 http-proxy,并使用类似 /proxy?src=http://a4.sphotos.ak.fbcdn.net/.../proxy/http://a4.sphotos.ak.fbcdn.net/... 的 URL。 - Aidan Feldman
@AidanFeldman 请查看 http-proxy 的 GitHub 存储库。第二个示例将在进行一些修改后实现您想要的功能。(https://github.com/nodejitsu/node-http-proxy) 在“设置具有自定义服务器逻辑的独立代理服务器”下。 - Barum Rho

4

这是另一个使用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://stackoverflow.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 );

1

你可以在你的express应用程序中添加另一个路由,例如/api/yahoo/...

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

但是,请记住你的代理是公开的,任何人都可以通过它发出请求。我建议进行一些基本的授权。你可以提供一个生成的值给发出请求的页面。


我正在尝试设置这个,但是出现了“ENOTFOUND,找不到域名”的错误。这是来自我的express app.js的相关代码:http://jsfiddle.net/4J3Wd/ 你有什么想法我做错了什么吗? - edt
1
搞定了。我的错误在于在.get()选项对象的主机值中包含了"http://"。这是可行的版本:http://jsfiddle.net/4J3Wd/1/。 - edt
你能告诉我更多关于如何设置基本授权的内容吗? - edt
1
当您呈现要进行API请求的页面时,请生成一个代码(将其保存在用户会话中),并将其作为js变量发送到页面。当页面需要访问您的/api/yahoo链接时,将该生成的值作为请求参数包含在内。在您的/api/yahoo视图中,检查请求参数是否与用户会话中的参数匹配;如果匹配,则继续请求。 - kcbanner

0

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

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接