1

Je crée ma première application majeure et j'ai pensé à un moyen d'optimiser les performances des requêtes. Je ne suis pas sûr si je devrais aller jusqu'au bout.Dois-je utiliser les informations stockées dans un cookie à des fins d'indexation?

Voici une description de mon approche.

Chaque fois qu'un compte utilisateur est créé, un nombre aléatoire compris entre 1 et 10 est attribué à cet utilisateur, qui est stocké dans son document utilisateur. Le numéro s'appelle un numéro-Id. Voici comment le schéma utilisateur ressemblera:

let User = new Schema({ 

/// I left out all the other fields for clairty sake 
numberId: { 
      type: Number, 
      default: Math.floor(Math.random() * 11), 
      index: true 
    } 
} 

Chaque fois qu'un utilisateur crée un blogpost et après, leur numéro Id est référencé dans le document de ce blogpost et post. Cela permet d'accélérer l'interrogation en indexant l'ID de numéro d'utilisateur. Voici comment le document d'un blogpost ressemblerait à MongoD:

{ 
    "title": "my Blog Post", 
    "_id": "ObjectId("594824b2828d7b15ecd7b6a5")", 
    /// Here is the numberId of the user who posted the blogpost, it is added 
    /// to the document of the blogpost when it is created. 
    "postersNumberId": 2 
    /// the Id of the user who posted the blogpost 
    "postersId": "59481f901f0c7d249cf6b050" 
} 

Disons que je veux obtenir toutes les blogposts faites par un utilisateur spécifique. Je peux optimiser ma requête beaucoup plus rapidement en utilisant le numéro-ID de l'utilisateur en question sous forme d'index, étant donné que leur numéro-ID est référencé dans tous les articles de blog et les commentaires qu'ils publient.

BlogPost.find({postersId: user_id, postersNumberId: user.numberId}); 

Il semble que cette approche mérite que je Programmez le numéro ID utilisateurs à req.user afin qu'elle soit facilement disponible chaque fois que je besoin pour optimiser les requêtes. Donc, cela signifie que je dois stocker les utilisateurs des données dans un cookie par l'intermédiaire de passeport:

passport.serializeUser(function(user, done){ 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 
    User.findById(id, function (err, user){ 
     if (err || !user) return done(err, null); 
     done(null, user); 
    }); 
}); 

Compte tenu de cette approche, je pouvais maintenant utiliser toutes les informations stockées dans le cookie, en particulier les numberId, pour optimiser les requêtes qui extraient la commentaires et blogposts un utilisateur fait:

BlogPost.find({postersId: req.user_id, postersNumberId: req.user.numberId}); 

Cependant, j'utilise des jetons-JSON Web pour authentifier l'utilisateur plutôt que les cookies. Donc, je vais devoir utiliser un cookie pour stocker le numéro-Id à des fins d'indexation en plus d'utiliser JWT pour l'authentification. J'ai entendu, cependant, qu'avoir des cookies est mauvais pour l'évolutivité, donc je suis inquiet que le stockage du numéro d'utilisateur-Id dans req.user finira par avoir un impact sur les performances.

Devrais-je continuer avec cette approche, ou non? Quelles sont les implications de performance?

Répondre

0

Outre l'authentification JWT a un payload, qui peut être utilisé pour stocker des informations supplémentaires dans le jeton généré lui-même:

var jwt = require('jsonwebtoken'); 

var token = jwt.sign({ 
    data: { 
     numberId: 7 
    } 
}, 'jwtSecret', { 
    expiresIn: '1h' 
}); 

Pour la récupération:

jwt.verify(token, 'jwtSecret', function(err, decoded) { 
    if (err) { 
     console.log(err) 
    } else { 
     console.log(decoded); 
     //{ data: { numberId: 7 }, iat: 1498350787, exp: 1498354387 } 
    } 
});