2017-10-18 232 views
0

我想使用node.js和Redis(Redis包)创建登录系统,但是每次我将输入数据与数据库数据进行比较时,我都会得到一个令人困惑的结果。这是第一种方法:登录系统 - Node.js和Redis

const Redis = require("redis"); 
const client = Redis.createClient(); 
exports.userLogin = (username, password, errMsg, successMsg, res) => { 
    client.keys("user*", (err, replies) => { 
    let isFound = false; 
    for (let i = 0; i < replies.length; i++) { 
     client.hgetall(replies[i], (err, value) => { 
     if (value.user === username && value.password === password) { 
      isFound = true; 
     } 
     }); 
    } 
    console.log(isFound); 
    if (isFound) { 
     successMsg(username, res); 
    } else { 
     errMsg(res); 
    } 
    }) 
)} 

我不断收到假即使登录名和密码都OK加上它不执行ERRMSG功能 Example 1 第二个例子:

exports.userLogin = (username, password, errMsg, successMsg, res) => { 
    client.keys("user*", (err, replies) => { 
     for (let i = 0; i < replies.length; i++) { 
      client.hgetall(replies[i], (err, value) => { 
      if (value.user === username && value.password === password) { 
       successMsg(username, res); 
      } else { 
       console.log("length: ", replies.length - 1); 
       console.log("i: ", i); 
       if(replies[i] === replies.length - 1) { 
       errMsg(res); 
       } else { 
       console.log("else statement: ", replies[i] === replies.length - 1); 
       return true; 
       } 
      } 
      }); 
     } 
     }) 
)} 

Example 2

它适用于密码和登录正常的情况,但如果它们不正确,则不会发生,因为页面正在载入内容并且不执行errMsg函数。你有什么想法?

+0

'hgetall'是一个异步调用,所以如果在得到结果之前测试'isFound',就会发生。 –

+0

@ t.niese如何修改此代码以使其正常工作? – miqezjo

+0

另一个问题是您在循环中创建异步调用。 –

回答

1

如果可以,请使用redis更改为更适合存储用户的内容。

否则,请改变数据在redis中的存储方式。你不想读所有的用户并且像这样循环它们。让db查询尽可能多地处理。也许有一种方法是让用户名成为密钥的一部分,这样你就可以直接查找正确的用户,并从那里检查密码。

不要忘记存储密码和处理登录的安全部分。如果密码需要安全,请查看哈希密码并添加密码salt。

+0

我需要使用Redis。我现在只进行测试,所以密码会被散列。我会尝试以用户为关键 – miqezjo