1

我正在做一个学校项目,我需要在不制作真实数据库的情况下验证一些用户。我的问题是,当我将输入中输入的信息与存储在 JSON 中的信息进行比较时,它会为每个不匹配的选项弹出一个错误。我想要的是将多个错误减少为一个(以防用户名或密码与存储在 JSON 中的信息不匹配)。这是我的 JavaScript:

const form = document.querySelector('form');

form.addEventListener('submit', function(e){
	e.preventDefault();
    
    const emailInput = document.querySelector('#email').value;
	const pwdInput = document.querySelector('#pwd').value;

	const object = {
		email: emailInput,
		pwd: pwdInput
	};

fetch('users.json')
  .then(res => res.json())
	.then(data => {
		data.forEach(function(user) {

			const userInfo = JSON.stringify(user);
			const databaseInfo = JSON.stringify(object);


			if(userInfo === databaseInfo) {
					console.log('success');
			} else {
				console.log('err');
			}

		});
	})

	.catch(error => console.log('error'));

});

这是用 JSON 制作的假数据库:

     [
      {"email": "James", "pwd": "1111"},
      {"email": "Peter", "pwd": "2222"},
      {"email": "Josh", "pwd": "3333"}
     ]
4

3 回答 3

1

使用原版 JavaScript:

// This is only to simulate your fetch from JSON
function fakeFetch () 
{
  return Promise.resolve([
    {"email": "James", "pwd": "1111"},
    {"email": "Peter", "pwd": "2222"},
    {"email": "Josh", "pwd": "3333"}
  ]);
}

const form = document.querySelector('form');

form.addEventListener( 'submit', function(e){
  e.preventDefault();
    
  const emailInput = document.querySelector('#email').value;
  const pwdInput = document.querySelector('#pwd').value;

  const object = {
    email: emailInput,
    pwd: pwdInput
  };

  fakeFetch()     
  .then( users => {
   
    // Check each user in users and try to find a match
    for ( let user of users )
    {
      // Destructuring email and password from the current user
      let { email, pwd } = user;
      
      // Comparing email and pwd from active user with the ones in object
      if ( email === object.email && pwd === object.pwd )
      {
        // Found, do something
        console.log( 'found!' );
        return;
      }
    }
    
    // Not found, do something else
    console.log( 'Not found...' );
    
  })
  .catch(error => console.log( error ) );

});
<form>
  <input type="text" id="email"/>
  <input type="test" id="pwd"/>
  <input type="submit"/> 
</form>

于 2018-09-10T19:03:02.743 回答
0

我尝试在评论中解释,但它可能更容易向您展示。我认为最好比较尽可能少的数据(而不是大的 JSON 字符串),例如电子邮件到电子邮件和密码到密码。

所以我改变了你if做一个更简单的比较。

要将所有错误压缩为一个,您可以包含一个标志并将其设置为true是否找到匹配项。然后在 forEach 循环之外,您可以检查该标志并仅记录 1 个错误(如果没有匹配项)

var users = [{
  email: "user1",
  pwd: "pass1"
}, {
  email: "user2",
  pwd: "pass2"
}];

var object = {
  email: "user3",
  pwd: "pass3"
};

var isMatch = false;
users.forEach(function(user) {
  if (user.email === object.email && user.pwd === object.pwd) {
    console.log("success");
    isMatch = true;
  }
});

if (!isMatch) {
  // only logs once even though there are multiple users
  console.log("No Match!");
}

于 2018-09-10T20:45:55.353 回答
0

您的函数的主要思想是,给定一个元组(用户名,密码),检查它是否存在于您的数据库中,在这种情况下,它是一个对象数组。您可以说您想从数组中过滤用户名和密码与用户插入的内容相匹配的条目。由于不应该有重复的用户名/密码元组,您的过滤器应该返回匹配的元组或 null。

一种方法可能如下:

function verifyLogin(loginObject) {
  return new Promise((resolve, reject) => {
    fetch('users.json')
      .then(res => res.json())
      .then(data => data.filter(entry => entry.email ===
loginObject.email && loginObject.pwd === object.pwd).length > 0 ? resolve(true) : resolve(false))

      .catch(error => reject(error));

  });
})

}

verifyLogin(loginObject)
  .then(result => result === true ? console.log('Login successful!') : console.log('Login failed'))
  .catch(error => console.log(error))

通过这种方式,代码显示了您要完成的工作并且没有副作用。

于 2018-09-10T21:56:06.140 回答