Вызов асинхронного метода внутри промежуточного ПО в узле -http -прокси

Я пытаюсь создать прокси-сервер с прокси-сервером 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, поэтому подозреваю недопонимание с моей стороны...

7
задан domguinard 27 July 2012 в 07:32
поделиться