2011-09-24 10 views
7

Soy nuevo en Node.js pero quería usarlo como un servidor web rápido que simplemente tomara una solicitud uri y luego ejecutara una consulta en un servicio interno que devuelve un JSON corriente.Node.js como un forwarder JSON

I.e. algo como esto:

http.createServer(function(request, response) { 
    var uri = url.parse(request.url).pathname; 
    if(uri === "/streamA") { 
    //send get request to internal network server http://server:1234/db?someReqA -->Returns JSON ....? 
    //send response to requestor of the JSON from the above get ....? 
    } 
    else if(uri === "/streamB") { 
    //send get request to internal network server http://server:1234/db?someReqB -->Returns JSON ....? 
    //send response to requestor of the JSON from the above get....? 
}.listen(8080); 

estoy usando la última versión estable de Node.js - versión 0.4.12. Esperaba que esto fuera muy fácil de hacer, sin embargo, no he podido encontrar algunos ejemplos en la red, ya que todos parecen usar una versión anterior de la API, así que recibo un error tras otro.

¿Alguien podría proporcionar una solución de código a las anteriores que funcione con las nuevas API de nodo?

Gracias!

Respuesta

6

aquí es un código que debe explicar su tarea:

var http = require('http'); 
var url = require('url') 

var options = { 
    host: 'www.google.com', 
    port: 80, 
    path: '/' //Make sure path is escaped 
}; //Options for getting the remote page 

http.createServer(function(request, response) { 
    var uri = url.parse(request.url).pathname; 
    if(uri === "/streamA") { 
    http.get(options, function(res) { 

     res.pipe(response); //Everything from the remote page is written into the response 
     //The connection is also auto closed 

    }).on('error', function(e) { 
     response.writeHead(500); //Internal server error 
     response.end("Got error " + e); //End the request with this message 
    }); 

    } else { 
    response.writeHead(404); //Could not find it 
    response.end("Invalid request"); 

    } 

}).listen(8080); 
+0

Gracias Nican, esto funciona cuando tengo una ruta como' path: '/ db?' 'pero cuando Lo cambio a una ruta diferente como esta: 'ruta de acceso: '/ db? {\" SQL \ ": \" SELECT * FROM classifier_results_summary \ "}' 'obtengo un socket colgado - res no está definido, alguna idea de por qué ? – NightWolf

+2

Actualizar de nuevo: use la ruta: función de escape ('myUrl') para asegurarse de que la ruta sea URL segura ... – NightWolf

+0

La función de escape utilizada es la biblioteca de JavaScript genérica, vea doco aquí http://www.w3schools.com /jsref/jsref_escape.asp – NightWolf

3

Debería usar express, sería mucho más fácil.

var app = express.createServer(); 

app.get('/json1', function(req, res){ 
    var json // = 
    res.send(json); 
}); 

app.get('/json2', function(req, res){ 
    var json // = 
    res.send(json); 
}); 

app.listen(8000); 
+0

Gracias por el ejemplo. Express se ve muy útil, pero al leer el doco es tan claro como el barro cómo lo haría en realidad un json obtener de otro servidor ... – NightWolf

+0

Usted podría simplemente utilizar la solicitud https://github.com/mikeal/request como tal ' request ('http: //', function (error, response, body) {res.send (body)}) ' – 3on

2

Ok ya que esta pregunta tiene un número de hasta-votos que parecería otros están interesados ​​en él también. Si bien la respuesta de Nican fue la más útil para obtener JSON real, decidí que mi solución usaría tanto el http lib como el express de 3on, ya que realmente me gusta su simplicidad ...

Así que para los interesados ​​mi solución final era un combo de los dos:

var http = require("http"), 
    url = require("url"); 

var app = require('express').createServer();  
app.listen(9898); 

var query = {"SQL" : "SELECT * FROM classifier_results_summary"}; 
var options = { 
    host: 'issa', 
    port: 9090, 
    path: '/db?'+ escape(JSON.stringify(query)) 
}; //Options for getting the remote page 

    app.get('/stream/:id', function(req, res){ 
     //console.log(options.path); 
     http.get(options, function(response) { 
     response.pipe(res); //Everything from the remote page is written into the response 
      //The connection is also auto closed 
     }).on('error', function(e) { 
      response.writeHead(500); //Internal server error 
      response.end("Got error " + e); //End the request with this message 
     }); 
    }); 

Muy bonito y ordenado. Gracias por toda la ayuda.

Cuestiones relacionadas