续集更好的编写此代码的方法

时间:2017-03-27 09:31:19

标签: javascript node.js promise sequelize.js

我正在使用NodeJSsequelize。我的应用程序中有两种登录方式。一个是普通用户登录,一个是公司登录。

下面的代码首先在公司表中查找令牌,如果它不存在,则移动到用户表中以找到它。

这样我知道谁登录了系统。

有更好的方法吗?

OR

有没有办法可以同时搜索两个表而不是等待sequelize在一个表中搜索然后再执行另一个表?

var token = req.get('Auth') || '';
db.token.findOne({
    where:{
        tokenHash: cryptojs.MD5(token).toString()
    }
}).then(function(tokenInstance){
    if(!tokenInstance){
        throw new Error();
    }
    req.token = tokenInstance;
    return db.company_auth.findByToken(token); //looks in the first table (company)
}).then(function(entity){
    if(entity === null){
        return db.user.findByToken(token); //if not found (then looks in the second table - user)
    }else{
        req.entity = entity;   
        next(); 
    }
}).then(function(user){
    req.user = user;
    next();
}).catch(function(e){
    console.log(e);
    res.status(401).send();
});

TIA!

1 个答案:

答案 0 :(得分:2)

是的,您可以轻松地同时在两个表中进行搜索,并使用Promise.all等待两个结果:

db.token.findOne({
    where:{
        tokenHash: cryptojs.MD5(req.get('Auth') || '').toString()
    }
}).then(function(tokenInstance){
    if (!tokenInstance)
        throw new Error("found no token");

    req.token = tokenInstance;
    return Promise.all([
        db.company_auth.findByToken(token), //looks in the first table (company)
        db.user.findByToken(token) // also looks in the second table - user)
    ]);
}).then(function([entity, user]){
    if (entity === null){
        req.user = user;
    } else {
        req.entity = entity;
        next();
        req.user = undefined;
    }
    next(); 
}).catch(function(e){
    console.log(e);
    res.status(401).send();
});