¿Cómo escribir una aplicación de node express que sirva para la mayoría de los archivos locales, pero que redireccione a otros a otro dominio?

Estoy trabajando en una pequeña aplicación web que normalmente se construye con un proceso relativamente complejo y luego se implementa en WebLogic.

Sin embargo, la parte en la que estoy trabajando es usar AngularJS, y es todo HTML y Javascript. Normalmente hace llamadas ajax a otra aplicación web en el mismo dominio. Para acortar mi ciclo de desarrollo, me gustaría evitar un proceso de comstackción y simplemente volver a cargar la página del navegador.

Creo que puedo hacer esto con “node express“, pero los detalles se me escapan. Me las arreglé para definir una aplicación muy simple que solo sirve archivos locales, pero ahora tengo que descubrir cómo detectar algunas de esas rutas que coinciden con una expresión y redirigir esas solicitudes a un dominio externo.

Por lo tanto, si recibe una solicitud para “/diag/stuff.html”, “/foo/thing.html”, o simplemente “/index.html”, enviará de vuelta el archivo que coincida con la misma ruta. Sin embargo, si la ruta coincide con “/fooService/.*”, entonces debo enviar la respuesta de un GET a la misma ruta, pero en un host y puerto diferentes.

Esta es mi aplicación trivial hasta ahora:

var express = require('express'); var app = express(); app.use("/", express.static(__dirname)); app.listen(8000); 

Actualizar:

Me gusta la idea del proxy, así que hice una instalación local de “http-proxy” (olvidé y primero hice una instalación global) y luego cambié el script a esto:

 var express = require('express'); var app = express(); var httpProxy = require('http-proxy'); var proxy = new httpProxy.RoutingProxy(); app.use("/", express.static(__dirname)); app.get('/FooService/*', function(req, res) { "use strict"; return proxy.proxyRequest(req, res, { host: "foohost.net", port: 80 }); }); app.listen(8000); 

Esto falla con:

 \server.js:4 var proxy = new httpProxy.RoutingProxy(); ^ TypeError: undefined is not a function at Object. (\server.js:4:13) 

¿Qué podría estar mal aquí?

Actualizar:

¿Sería útil ver el contenido de “console.log (httpProxy)” después de que “require” ?:

 function ProxyServer(options) { EE3.call(this); this.web = this.proxyRequest = createRightProxy('web')(options); this.ws = this.proxyWebsocketRequest = createRightProxy('ws')(options); this.options = options; this.webPasses = Object.keys(web).map(function(pass) { return web[pass]; }); this.wsPasses = Object.keys(ws).map(function(pass) { return ws[pass]; }); this.on('error', this.onError.bind(this)); } 

¿Eso proporciona una pista de por qué “nuevo httpProxy.RoutingProxy ()” dice que está indefinido?

Puede usar http-proxy y reenviar solicitudes a diferentes hosts. Para instalar http-proxy necesita ejecutar sudo npm install http-proxy . El código que manejará el proxy se verá así:

 httpProxy = require('http-proxy'); proxy = new httpProxy.RoutingProxy(); (...) app.get('/fooService/*', function (request, response) { "use strict"; return proxy.proxyRequest(request, response, { host : externalHost, port : 80 }); }); 

ACTUALIZAR

El código anterior funciona para http-proxy ~ 0.10.x. Desde entonces muchas cosas han cambiado en la biblioteca. A continuación puede encontrar un ejemplo para la nueva versión (en el momento de escribir ~ 1.0.2):

 var httpProxy = require('http-proxy'), proxy = httpProxy.createProxyServer({}); (...) app.get('/fooService/*', function (request, response) { "use strict"; return proxy.web(request, response, { target: 'http://fooservice.com' }); }); 

Si las redirecciones satisfacen sus necesidades, entonces esa es la solución más fácil:

 var express = require('express'); var app = express(); app.use(express.static(__dirname + '/public')); app.use(app.router); app.get('/fooService/*', function(req, res){ res.redirect(302, 'http://otherdomain.com:2222' + req.path); }); app.listen(8000); 

Tenga en cuenta que generalmente se considera una buena práctica usar un subdirectorio para sus archivos estáticos (como el public anterior). De lo contrario, podría ver su propio archivo de aplicación y cualquier otra cosa que guarde en su raíz de aplicación.