2015-09-13 5 views
2

Я пытаюсь сравнить введенное письмо на моем веб-сайте, а также те, которые находятся в базе данных, чтобы узнать, существует ли он уже. Если это так, функция возвращает false и отображается ошибка.sqlite3 callbacks (node.js)

var db = new sqlite3.Database('users_db.db'); 

db.get(
    "SELECT * FROM users WHERE useremail = ?", 
    [email], 
    function (err, rows) { 
     if (rows == undefined){ 
      global.returnvalue2 = false; 
     } 
    } 
); 

То, что я хочу, это функция будет работать сразу же после выбора, так что возвращаемое значение является ложным, а запись пользователя не создается.

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

Как проверить, есть ли существующие записи с тем же адресом электронной почты?

+0

Почему вы не можете создать запись пользователя внутри обратного вызова? – Soren

+0

@Soren Поскольку система работает через 3 проверки по электронной почте, паролю и «классу». Если все 3 возвращают true, тогда запись будет создана. Поскольку узел пропускает последнюю проверку электронной почты, он возвращает «true», и поэтому запись создается до того, как будет выполнен обратный вызов. –

+0

Итак, сделайте каскадный обратный вызов - вы не можете сделать это с последовательным программированием – Soren

ответ

2

Используйте функции async в javascript, чтобы ваш код выглядел примерно так;

var db = new sqlite3.Database('users_db.db'); 
function checkemail(email, cb) { 
    db.get(
     "SELECT * FROM users WHERE useremail = ?", 
     [email], 
     function (err, rows) { 
      if (err || rows == undefined){ 
       cb("bad email", null) 
      } else { 
       cb(null,rows) 
      } 
     }); 
} 
function checkpassword(pw,cb) {....} 
function checkclass(cls,cb) {....} 

, а затем напишите вам такой код;

checkemail(myemail, function(err,rows) { 
    if (err) return alert(err); 
    checkpassword(pw, function(err, msg) { 
     if (err) return alert(err); 
     checkclass(cls, function(err, msg) { 
      if (err) return alert(err); 
      alert("Congratulation you passed all the checks"); 
     }); 
    }); 
}); 
+0

Большое вам спасибо! Мне пришлось отредактировать его, чтобы он соответствовал моему коду, а также в 'if (err || rows == undefined)' Я изменил на! =, Поскольку он не определен, означает, что письмо _doesn't_ существует. Вы лучший <3 –

0

Вот что я сделал.

const sqlite3 = require('sqlite3').verbose(); 
let db = new sqlite3.Database('iHacks.db'); 

function get_user_credentials (email, password) 
{ return new Promise((rs, rj) => { 
    function callback (err, User) 
    { 
    if (err) rj(err); 
    rs(User); 
    } 

    db.get('select * from users where email=? and password=?', [email, password], callback); 
}); } 

function login (email, password) 
{ return new Promise ((rs, rj) => { 
    // Hashing the password. 
    password = sha256(password + 'EzSalt'); 

    // Creating an Error 
    const err = new Error('Email or password did not match!'); 

    // Callback functions 
    function check (User) 
    { 
    rs(User); 
    }  

    function fail (err) 
    { 
    rj(err); 
    } 

    // Getting the user credentials 
    get_user_details(email, password).then(check).catch(fail);  

}); } 

login() 
    .then(/* Continue code */) 
    .catch(err => {throw new Error(err); }) 
    ; 
+0

Хотя ответ только на основе кода - это действительно ответ, небольшое объяснение (какова общая идея вашего кода, важные моменты, предупреждения и т. Д.), Может сделать это * лучшим * ответом , – lfurini