Próbuję utworzyć serwer proxy z węzłem-http-proxy w Node.js, który sprawdza, czy żądanie jest autoryzowane w mongodb.Wywoływanie metody asynchronicznej wewnątrz oprogramowania pośredniego w węźle-http-proxy
Zasadniczo, stworzyłem moduł middleware dla węzła-http-proxy, że używam tak:
httpProxy.createServer(
require('./example-middleware')(),
9005, 'localhost'
).listen(8005)
Co moduł middleware robi korzysta mongojs połączyć się MongoDB i uruchomić kwerendę, aby sprawdzić, czy użytkownik jest uprawniony do dostępu do zasobów:
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();
}
});
}
}
teraz problemem jest to, że jak tylko dodam asynchroniczne wywołanie MongoDB użyciu mongojs zawiesza proxy i nie wysyła odpowiedź z powrotem.
Aby wyjaśnić: na "Użytkownik nie potwierdzony" wszystko działa poprawnie, a 403 jest zwracana. Na "potwierdzonym przez użytkownika" widzę jednak log, ale przeglądarka zawiesza się na zawsze, a prośba nie jest proxowana.
Teraz, jeśli usunąć „użytkownik potwierdził” i następne() część poza wywołania zwrotnego to działa:
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();
}
ale nie mogę tego zrobić, ponieważ kwerenda mongojs rozumie (I słusznie chyba) być wykonywane asynchronicznie, callback jest uruchamiany tylko wtedy, gdy db odpowiedział ...
próbowałem też wersję bez użycia middleware:
http.createServer(function (req, res) {
// run the async query here!
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
}).listen(8001);
Ale to nie pomogło albo ...
Jakaś wskazówka? Zauważ, że jestem nowy node.js więc podejrzewam nieporozumienie na mojej stronie ...
co middleware używasz? połączyć? –