Я пытаюсь создать прокси-сервер с прокси-сервером node -http -в Node.js, который проверяет, авторизован ли запрос в mongodb.
По сути, я создал модуль промежуточного программного обеспечения для узла -http -прокси, который я использую следующим образом:
httpProxy.createServer(
require('./example-middleware')(),
9005, 'localhost'
).listen(8005)
Что делает модуль промежуточного программного обеспечения, так это использует mongojs для подключения к mongodb и запускает запрос, чтобы узнать, авторизован ли пользователь для доступа к ресурсу :
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();
}
});
}
}
. Теперь проблема в том, что как только я добавляю асинхронный вызов mongodb с помощью mongojs, прокси-сервер зависает и никогда не отправляет ответ обратно.
Чтобы уточнить :на «Пользователь не подтвержден», все работает нормально, и возвращается 403. Однако при «подтвержденном пользователе» я вижу журнал, но затем браузер зависает навсегда, и запрос не передается через прокси.
Теперь, если я удалю «пользователь подтвержден» и следующую часть ()вне обратного вызова, это сработает:
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();
}
но я не могу этого сделать, так как запрос mongojs предназначен (по праву, я предполагаю, что )будет выполняться асинхронно, обратный вызов запускается только тогда, когда db ответил...
Я также пробовал версию без промежуточного программного обеспечения :
http.createServer(function (req, res) {
// run the async query here!
proxy.proxyRequest(req, res, {
host: 'localhost',
port: 9000
});
}).listen(8001);
. Но и это не помогло...
Любая подсказка? Обратите внимание, что я новичок в node.js, поэтому подозреваю недопонимание с моей стороны...