节点中的令牌生成器和表达式

时间:2016-06-28 17:14:32

标签: node.js mongodb

我尝试创建一个函数,生成一个在我的数据库中不存在的随机标记( Mongodb ),并在我的用户模式中使用唯一属性。这是我的功能:

 var UniqueTokenGenerator = function () {

        var token = uuid.v4();
        UserModel.findOne({token : token} , (err , user)=> {

            if(err)
                res.status(500).send(err);
            else if(user){
                //1
            }else if(!user){
                 return token; //2
            }

        });

    };

我的问题:

  1. 我想如果存在令牌,则调用UniqueTokenGenerator或其他......如loop。
  2. 无法返回令牌。
  3. 有人有更好的主意吗?
  4. 我不想使用像jwt这样的库。

1 个答案:

答案 0 :(得分:0)

两个答案:

首先,您不需要检查数据库以确保您的UUID是唯一的。 UUID非常大,数学上你不会遇到碰撞。见Are GUID collisions possible?

其次,要做你正在尝试做的事情,你需要使你的函数异步并通过回调传递结果。 E.g。

var generateUniqueToken = (callback) => {
    var token = uuid.v4();
    UserModel.findOne({ token: token }, (err, user) => {
        if(err) {
            // First parameter of the callback is an error.
            callback(err);
        } else if (user) {
            // Try again.
            generateUniqueToken(callback);
        } else if (!user) {
            // First parameter of the callback is an error. The second
            // parameter is the successful result.
            callback(null, token);
        }
    });
};

// Example usage:
generateUniqueToken((err, token) => {
    if (err) {
        res.status(500).send(err);
    } else {
        // Use the token here.
    }
});