2016-09-16 3 views
0

Я использую узел js $ http для обработки запроса HTTP post, который аутентифицирует пользователя по почте и паролю с помощью DB (mongoDB).HTTP post req не синхронизируется с DB req

Проблема в том, что запрос БД требует времени и, следовательно, не синхронизируется с http-вызовом. Я возвращаюсь обратно http с req == undefiend, потому что я не жду (с обещанием или что-то в этом роде, до завершения db-запроса).

Поскольку я новичок в JS и узле JS, я буду признателен, если кто-то поможет мне исправить мой код. Благодаря!

Важно: он будет работать, если я пошлю req с истинным или ложным значением прямо из внутренней функции -> Я знаю это! но .. Я хочу, чтобы это было написано более общим образом - я хочу, чтобы логика http не была связана с логикой db.

app.post('/authenticate_user', function(req, res){ 
    var mail = req.body.Mail; 
    var password = req.body.Password; 
    res.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate, max-age=0"); 
    var isValid=authenticate_user(mail, password); 

console.log("isValid-->"+isValid); 
    // I get undefiend since at this time the db did nor finish... 

    res.json(isValid); 
}); 
var authenticate_user=function(mail, password){ 
    var query = user_details.find({'Mail': mail}); 
    query.exec(function(err, docs){ 
     if (docs.length==0) { 
      return false; 
     } 
     else{ 
      return(docs[0].Password==password); 
     } 
    }); 
} 

ответ

0

Насколько ваш код идет, это, вероятно, самый простой способ - просто передать ваши HTTP разрешения объекта в вашу БД обещание и разрешить его после того, как результат DB приходит в:

app.post('/authenticate_user', function(req, res) { 
    var mail = req.body.Mail; 
    var password = req.body.Password; 
    res.setHeader("Cache-Control", "private, no-cache, no-store, must-revalidate, max-age=0"); 
    authenticate_user(res, mail, password); 
}); 
var authenticate_user = function(res, mail, password) { 
    var query = user_details.find({ 
    'Mail': mail 
    }); 
    query.exec(function(err, docs) { 
    var isValid = false; 
    if (docs.length == 0) { 
     isValid = false; 
    } 
    else { 
     isValid = (docs[0].Password == password); 
    } 
    res.json(isValid); 
    }); 
}; 
1

" good node.js/event driven "способ сделать это - не ждать.

Как и все остальное при работе с системами, управляемыми событиями, такими как узел, ваша функция должна принимать параметр обратного вызова, который будет вызываться, когда вычисление будет завершено. Вызывающий абонент не должен ждать, пока значение, которое будет «возвращен» в обычном смысле этого слова, а скорее отправить программу, которая будет обрабатывать результирующее значение:

function(query, callback) { 
    myApi.exec('SomeCommand', function(response) { 
    // other stuff here... 
    // bla bla.. 
    callback(response); // this will "return" your value to the original caller 
    }); 
} 

Так вы не использовать его как это:

var returnValue = myFunction(query); 

Но как это:

myFunction(query, function(returnValue) { 
    // use the return value here instead of like a regular (non-evented) return value 
}); 
+0

это обратный вызов способ работы такой же, как с помощью обещание когда -> затем метод? – Matoy

Смежные вопросы