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 ...
lo middleware está usando? ¿conectar? –