2012-07-26 4 views
7

Estoy intentando crear un proxy con node-http-proxy en Node.js que comprueba si una solicitud está autorizada en un mongodb.Invocación de un método asíncrono dentro de un middleware en node-http-proxy

Básicamente, he creado un módulo de middleware para el nodo-http-proxy que utilizo como esto:

httpProxy.createServer(
require('./example-middleware')(), 
9005, 'localhost' 
).listen(8005) 

Lo que el módulo de middleware hace es utilizar mongojs para conectarse a MongoDB y ejecutar una consulta para ver si el usuario está autorizado a acceder al recurso:

module.exports = function(){ 
// Do something when first loaded! 
console.log("Middleware loaded!"); 

return function (req, res, next) { 
var record = extractCredentials(req); 
var query = -- Db query -- 

//Debug: 
log("Query result", query); 

db.authList.find(query).sort({ 
    "url.len": -1 
}, function(err, docs){ 
    console.log(docs); 

    // Return the creator for the longest matching path: 
    if(docs.length > 0) { 
     console.log("User confirmed!"); 
     next(); 
    } else { 
     console.log("User not confirmed!"); 
     res.writeHead(403, { 
      'Content-Type': 'text/plain' 
     }); 
     res.write('You are not allowed to access this resource...'); 
     res.end(); 
    } 

}); 

} 
} 

Ahora el problema es que tan pronto como se agrego la llamada asincrónica a MongoDB usando mongojs los bloqueos de proxy y nunca envía la respuesta de vuelta.

Para aclarar: en un "Usuario no confirmado" todo funciona bien y se devuelve el 403. En un "usuario confirmado", sin embargo, veo el registro, pero el navegador se cuelga para siempre y la solicitud no se procesa.

Ahora, si me quito el "usuario confirma" y una parte próxima() fuera de una devolución de llamada que hace el trabajo:

module.exports = function(){ 
// Do something when first loaded! 
console.log("Middleware loaded!"); 

return function (req, res, next) { 
    var record = extractCredentials(req); 
    var query = --- query --- 


    console.log("User confirmed!"); 
    next(); 
} 

pero no puedo hacer eso ya la consulta mongojs está destinado (con razón me supongo) para ser ejecutado de forma asíncrona, la devolución de llamada se activa sólo cuando el PP respondió ...

también probé la versión sin necesidad de utilizar un middleware:

http.createServer(function (req, res) { 
    // run the async query here! 
    proxy.proxyRequest(req, res, { 
    host: 'localhost', 
    port: 9000 
}); 
}).listen(8001); 

Pero eso no ayuda ya sea ...

¿Alguna pista? Tenga en cuenta que soy nuevo en Node.js así que sospecho que un malentendido de mi lado ...

+0

lo middleware está usando? ¿conectar? –

Respuesta

6

encontrado la respuesta, en realidad el problema es que la solicitud debe ser protegido: la

httpProxy.createServer(function (req, res, proxy) { 
// ignore favicon 
if (req.url === '/favicon.ico') { 
    res.writeHead(200, { 
     'Content-Type': 'image/x-icon' 
    }); 
    res.end(); 
    console.log('favicon requested'); 
    return; 
} 

var credentials = extractCredentials(req); 
console.log(credentials); 

var buffer = httpProxy.buffer(req); 

checkRequest(credentials, function(user){ 
    if(user == ...) { 
     console.log("Access granted!"); 
     proxy.proxyRequest(req, res, { 
      host: 'localhost', 
      port: 9005, 
      buffer: buffer 
     }); 
    } else { 
     console.log("Access denied!"); 
     res.writeHead(403, { 
      "Content-Type": "text/plain" 
     }); 
     res.write("You are not allowed to access this resource..."); 
     res.end(); 
    } 

}); 

}).listen(8005); 
+0

Pero, ¿cómo es posible que dentro de un middleware, como el objeto proxy todavía no esté disponible (porque los middlewares se cargan antes de declarar la función que contiene el argumento "proxy")? – Mark

2

dos problemas:

  1. No está llamando next(); en el caso de su elsesort de devolución de llamada.
  2. El segundo parámetro para su devolución de llamada sort es Cursor, no una matriz de documentos. Como tal, docs.length > 0 nunca es verdadero y el código siempre sigue la ruta else.
+0

¡Hola! Gracias. Supongo que mi pregunta no era lo suficientemente clara, así que la edité (¡está mal!). Llamé a escribir una respuesta en la cláusula else (ver nuevas ediciones) y el segundo parámetro de género es una devolución de llamada y no un cursor, como dije, estoy usando mongojs no el controlador nativo mongo javascript (la consulta funciona bien). – domguinard

+0

Ah, no hay problema; es malo por perderme el poder de esto. ¿No es el tercer parámetro de su nodo-http-proxy middleware función un objeto 'proxy', no una función' next'? https://github.com/nodejitsu/node-http-proxy/#setup-a-stand-alone-proxy-server-with-custom-server-logic – JohnnyHK

+0

Bueno, aparentemente es una función next(). Intenté con un proxy pero me da el mismo resultado: ambos proxy.proxyRequest (req, res); y después(); trabajo cuando está fuera de una devolución de llamada, pero no dentro. El proxy aún se cuelga ... – domguinard

Cuestiones relacionadas