IndexDB не будет запускать функцию, предназначенную для ошибки

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

Подтверждение входа:

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');
        }

};
}

Материал БД:

 //-------------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;
}

person Batman    schedule 20.03.2013    source источник


Ответы (1)


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

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');
    }

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

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

person Kristof Degrave    schedule 20.03.2013
comment
Спасибо, я попробую это в ближайшее время и посмотрим, сработает ли это. Это просто задание класса, поэтому сайт не будет использоваться публикой. Но просто чтобы я знал, плохо ли устанавливать пароли, потому что они не зашифрованы? Спасибо. - person Batman; 20.03.2013
comment
Как правило, хранить пароли на клиенте небезопасно даже в зашифрованном виде. - person Kristof Degrave; 20.03.2013