2013-03-20 5 views
0

Im используя indexeddb для запуска приложения для входа. Я пытаюсь запустить предупреждение, если пользователь помещает имя пользователя еще не в базу данных. Однако событие onerror не запускает оповещение, которое я настроил. Эта же функция с onsuccess работает, поэтому я не уверен, в чем проблема.IndexDB не запускает функцию, предназначенную для ошибки

Вход проверки:

function getLogin(){ 
    alert('getLogin launched'); 
    var user = logUser.value; 
    var pass = logPass.value; 
    alert('User: '+user+' Pass: '+pass+" sent to loginCheck"); 
    loginCheck(user,pass); 
    alert ('user/pass checked'); 
} 

function loginCheck(user,pass){ 

    db.transaction("users").objectStore("users").get(user).onerror = function(event) { 
    alert('Sorry this is not a valid username'); 
}; 

    db.transaction("users").objectStore("users").get(user).onsuccess = function(event) { 
     var x = event.target.result; 
     if(pass !== x.pw){alert('Sorry, wrong password'); 
     } 

}; 
} 

DB материал:

//-------------USER DB------------------// 
function startDB(){ 
    //sign in page elements 
    logUser = document.getElementById('logUserName'); 
    logPass = document.getElementById('logPass'); 
    signin = document.getElementById('signin'); 
    signin.addEventListener('click',getLogin); 

    //register page elements 
    mainForm = document.getElementById('mainFormSidebar'); 
    mainForm.addEventListener('submit',addObject); 
    fname = document.getElementById('fName'); 
    lName = document.getElementById('lName'); 
    users = document.getElementById('uName'); 
    pass = document.getElementById('password'); 
    email = document.getElementById('email'); 
    dob = document.getElementById('dob'); 
    phone = document.getElementById('phone'); 
    bio = document.getElementById('bio'); 
    terms = document.getElementById('terms'); 
    school = document.getElementById('school'); 
    gender = document.getElementsByName('gender'); 
    save = document.getElementById('save'); 
    reset = document.getElementById('reset'); 
    reset.addEventListener('click',clearForm); 
    databox = document.getElementById('databox'); 



    //open DB 
    var request = indexedDB.open('macroPlay'); 
    //if fails 
    request.addEventListener('error', showerror); 
    //if succeeds 
    request.addEventListener('success', start); 
    //if !exist, create. 
    request.addEventListener('upgradeneeded', createdb); 

    //Create Admin account on launch 

} 
function showerror(e){ 
    alert('Error: ' + e.code + ' - ' + e.message); 
} 
function start(e){ 
    alert('function start was called'); 
    db = e.target.result; 
    chkAdmin(); 
    showUsers();// Show all values in the object store 
} 
function createdb(e){ 
    var datababase = e.target.result; 
    var myusers = datababase.createObjectStore('users', {keyPath: 'userName'}); 
} 
function addObject(){ 
    if(confirm('Are you sure you want to resgister?')){ 
     var fName = document.getElementById('fName').value; 
     var lName = document.getElementById('lName').value; 
     var userName = document.getElementById('uName').value; 
     var pass = document.getElementById('password').value; 
     var email = document.getElementById('email').value; 
     var dob = document.getElementById('dob').value; 
     var phone = document.getElementById('phone').value; 
     var bio = document.getElementById('bio').value; 
     var terms = document.getElementById('terms').value; 
     var school = document.getElementById('school').value; 

     //May need to set a loop to find value of radio 
     var gender; 
     var radios = document.getElementsByName('gender'); 

     for (var i = 0, length = radios.length; i < length; i++) { 
      if (radios[i].checked) { 
       gender=radios[i].value; 
      } 
     } 

     //set up transaction 
     var mytransaction = db.transaction(['users'], "readwrite"); 

     //get object store 
     var myusers = mytransaction.objectStore('users'); 

     //Add item 
     var request = myusers.add(new getUser(userName,fName,lName,pass,email,dob,phone,bio,terms,school,gender)); 
    } 

    // Show all results. 
    mytransaction.addEventListener('complete', showUsers); 

    //Reset Form Fields 
    resetForm(); 


} 
function getUser(userName, fn, ln, pw, em, dob, tel, bio,tm, scl, gender){ 
    this.userName = userName; 
    this.fn = fn; 
    this.ln = ln; 
    this.pw = pw; 
    this.em = em; 
    this.dob = dob; 
    this.tel = tel; 
    this.bio = bio; 
    this.tm = tm; 
    this.scl = scl; 
    this.gender = gender; 
} 

ответ

1

Если объект не найден в хранилище объектов, он не возвращает ошибку. Овертер будет вызван только тогда, когда что-то пошло не так, как прохождение недействительного ключа.

event.target.result -> это не определено, если ничего не найдено. Вам необходимо сделать следующее:

db.transaction("users").objectStore("users").get(user).onsuccess = function(event) { 
    var x = event.target.result; 
    if(!x) { 
     alert('Sorry this is not a valid username'); 
    } 
    else if(pass !== x.pw){ 
     alert('Sorry, wrong password'); 
    } 

Btw один маленькая сторона примечание. Я бы никогда не сказал пользователю, что использует недопустимое имя пользователя или неверный пароль. Лучше сказать «комбинация username/pwd была неправильной». В противном случае вы облегчите людям с плохими намерениями;).

Другие боковые узлы. Я не думаю, что хранить пароли в вашем индексированном блоке очень безопасно.

+0

Благодарим вас, пробуйте это в ближайшее время и посмотрите, работает ли оно. Это просто присвоение класса, поэтому сайт не будет использоваться общественностью. Но так я знаю, плохо ли устанавливать пароли, потому что он не зашифрован? Спасибо. – Batman

+0

В общем, безопасно хранить пароли на клиенте даже зашифрованными. –

+0

О, ладно, спасибо, что сообщили мне. – Batman

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