Ich versuche, einen Proxy mit Knoten-http-Proxy in Node.js zu erstellen, die überprüft, ob eine Anfrage in einem Mongodb autorisiert ist.Aufrufen einer asynchronen Methode innerhalb einer Middleware in Knoten-http-Proxy
Im Grunde habe ich eine Middleware-Modul für den Knoten-http-Proxy, die ich wie folgt verwenden:
httpProxy.createServer(
require('./example-middleware')(),
9005, 'localhost'
).listen(8005)
Was die Middleware-Modul tut, ist mongojs mit zu verbinden, eine Abfrage MongoDB und laufen zu sehen, ob der Benutzer berechtigt ist auf die Ressource zuzugreifen:
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();
}
});
}
}
das Problem ist jetzt, dass, sobald ich den asynchronen Aufruf hinzufügen mongojs die Proxy hängt MongoDB mit und nie wieder die Antwort senden.
Zur Verdeutlichung: Bei einem "User nicht bestätigt" funktioniert alles einwandfrei und der 403 wird zurückgegeben. Bei einem "user confirmed" sehe ich allerdings das Protokoll aber der Browser bleibt dann für immer hängen und die Anfrage wird nicht proxisiert.
Nun, wenn ich die entfernen „Benutzer bestätigt“ und next() teilweise außerhalb eines Rückrufes es funktioniert:
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();
}
aber ich kann das nicht tun, da die mongojs Abfrage (zu Recht bedeutet, dass ich guess) asynchron ausgeführt werden, der Rückruf nur dann ausgelöst wird, wenn der db antwortet ...
ich habe auch versucht, die Version ohne eine Middleware:
http.createServer(function (req, res) {
// run the async query here!
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
}).listen(8001);
Aber das hat nicht geholfen entweder ...
Irgendwelche Hinweise? Bitte beachte, dass ich bin neu node.js so vermute ich ein Missverständnis auf meiner Seite ...
welche Middleware verwenden Sie? verbinden? –