2017-05-17 163 views
1

我正在使用rethinkdb將用戶添加到用戶表中。我將用戶添加得很好,我在數據資源管理器中看到了正確的數據。我現在有點難以忍受,一旦有人添加新的用戶名以查看它是否存在,我該如何檢查數據庫,如果有,請添加新用戶。我想我可以從數據庫中抓取所有當前用戶,並根據我要添加的新用戶名進行循環檢查。下面是我想:檢查用戶是否存在於Rethinkdb數據庫中

router.post('/signup', (req, res) => { 

    let newUser  = req.body.username, 
     currentUsers = []; 

    r.db('base').table('users') 
    .then((users) => { 
     users.forEach((user) => { 
      currentUsers.push(user.username) 
     }); 
    }).then(() => { 

     if (currentUsers.length === 0) { 
      addUser(req.body); 
     } 

     currentUsers.forEach((name) => { 

      if (newUser !== name) { 
       console.log('new user added!'); 
       addUser(req.body); 
      } 

      if (newUser === name) { 
       console.log('user exists!'); 
      } 

     }); // end forEach() 

    }); // end last .then() 


    function addUser(user) { 
     Users.create(user, (error, response) => { 
      if (error) return res.end(); 
     }); 
    } // end addUser(user) 


}); // end router.post() 

我的想法在這裏處理是在數據庫中是空的,調用函數的adduser添加用戶名第一。這很好,但是當我嘗試添加多個新用戶時,情況變得糟糕。假設我在數據庫中有用戶名丹。如果我再次嘗試添加丹,它的時候它不應該運行ADDUSER功能和控制檯給了我兩個消息:

user exists! 
new user added! 

它也將開始雙重和三重和等數據庫的名字,每次我嘗試添加新用戶。我在這裏做錯了什麼?我對rethinkdb有點新,所以我想我只是做錯了。我能得到的任何幫助都會很棒。多謝你們。

回答

0

好的。所以在經過一些修改和從工作人員的幫助之後,我得到了這個按預期工作,經過一些重大的代碼更改。原來,使用.map()來循環用戶就像這是我繼續運行該名稱是否匹配的功能的原因。更好的方法是使用if (_.size(users) > 0) {}來檢查用戶。我會在下面發佈對我有用的東西,希望這會幫助其他人。

相近的新代碼注意:

  • 我創建了一個連接功能,爲我們連接。
  • 你會發現_在像_.isEmpty(username)地方。這裏我使用Lodash庫。
  • User.getUser()在這裏不需要,但它用於在網絡選項卡下看到您在瀏覽器控制檯中添加的用戶。

工作代碼:

function connect() { 
    return r.connect({ 
     host: config.rethinkdb.host, 
     port: config.rethinkdb.port, 
     db: config.rethinkdb.db 
    }); 
} 

router.post('/signup', (req, res) => { 

    const username = _.get(req.body, 'username', ''); 

    if (_.isEmpty(username)) { 
     return res.status(201).json({ 
      message: 'username cannot be empty' 
     }); 
    } 

    return connect() 
     .then(connection => { 
     return r 
     .table('users') 
     .getAll(username, { index: 'username'}).run(connection) 
     .then((cursor) => cursor.toArray()) 
     .then((users) => { 

      // If user exist return error 
      if (_.size(users) > 0) { 
       console.log('user already exist'); 
       return res.status(201).json({ 
        message: 'user already exist!' 
       }); 
      }; 

      Users.create(req.body, (error, user) => { 
       if (error) return res.status(500).json({ 
        error: error, 
        message: 'Something messed up' 
       }); 

       const userID = user.generated_keys[0]; 

       Users.getUser(userID, (err, user) => { 
        return res.status(200).json({ 
         user: user 
        }); 
       }); 
      }); 
     }); 
    }); 
}); 
2

很高興你解決它。但是你正在抓取所有用戶,將它們暫時放在服務器的內存中,循環遍歷每個用戶,只是爲了檢查新用戶是否存在!這是緩慢的,消耗內存和不必要的。

這裏是你能做什麼更好:

  1. 更改「用戶」表「用戶名」的主鍵。 Here is how to do so,您需要使用選項primaryKey
  2. 使用下面ReQL插入新的用戶,這將在表中插入新用戶只有用戶名不存在

-

r.db("my_db").table("users").insert(newUser, {conflict: "error"}); 

所有的代碼在一個做行:)

,或者,如果你想要的是隻是爲了檢查,如果「用戶名」的存在不插入,你可以這樣做:

r.db("my_db").table("users").filter({username: newUserName}).count().eq(1); 
+0

哦,這是偉大的!非常感謝您在這裏的回答。我不知道我甚至可以做到這一點。加上所有在一行是真棒=) –

相關問題