Reputation: 6353
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
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