Batman
Batman

Reputation: 6353

IndexDB won't run function intended for error

Im using an indexeddb to run a login application. I'm trying to run an alert if the user puts in a username not already in the database. However, the onerror event isn't running the alert I set up. The same function with onsuccess is working so im not sure what the problem is.

Log in verification:

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 stuff:

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

Upvotes: 0

Views: 133

Answers (1)

Kristof Degrave
Kristof Degrave

Reputation: 4180

If an object isn't found in the object store, it won't return an error. The onerror will only be called when something went wrong like passing an invalid key.

event.target.result --> this will be undefined if nothing is found. You need to do the following:

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 one little side note. I would never tell the user he is using an invalid username or an invalid password. It is better to say "the combination username/pwd was incorrect." Otherwise you make it easier for people with bad intentions ;).

Other side node. I don't think it is very safe to store passwords in your indexeddb.

Upvotes: 1

Related Questions