2016-07-11 1 views
0

D'après ce que je comprends, le code ci-dessous va supprimer le document et le retourner comme deuxième argument au rappel. Est-ce vrai? Je trouve beaucoup d'informations contradictoires sur internet. J'ai déjà utilisé une approche similaire, mais s'il y a une meilleure approche, je suis prêt à l'adapter. Je dois supprimer le document et accéder à deux de ses champs: _id et conversation respectueusement. merci, je vais raccrocher et écouter.confusion à propos de findOne() et remove()

deleteMessage: function(userId,messageId,callback){ 

    model.Message.findOne({_id: messageId, user: userId}).remove().exec(function(err,removed){ 
     // removed should be the deleted document or some falsey value 
     if(err || !removed){ 
      return callback('Invalid messageId or user does not have permission to delete this message',null); 
     } 
     callback(null,'Message Deleted');//success 

     //we have access to the removed document, so we can get the conversation id easily and emit to the users. 
     io.to('convo_'+removed.conversation.toString()).emit('messaging.messageDeleted',{ message: removed._id.toString() }); 

    }); 

}, 

Pour clarifier Ceci est une interface de commande abstraite pour utilisé par apis plus spécifiques de mise en œuvre. Fondamentalement, il normalise cette opération sur tous les protocoles que nous soutenons ou que nous soutiendrons dans le futur.

Voici un exemple de la façon dont cette méthode est utilisée à partir socket.io:

socket.on('messaging.deleteMessage',function(data){ 
    var mid = data.message || false; 
    MessagingAPI.deleteMessage(user.id,mid,function(err,results){ 
     socket.emit('messaging.deleteMessage',{error:err,results: results}); 
    }); 
}); 

donc oui, toute mise à jour de cette méthode du contrôleur envoie n'appartiennent à la méthode et non dans le rappel. le rappel est seulement pour l'initiateur. rien d'autre.

Répondre

0

Votre méthode est absolument correcte mais à mon humble avis je préférerais faire de cette façon. Il semble plus logique et séquentiel. Je pense qu'une fois que vous appelez le rappel, il ne devrait rien y avoir de suivi. Sinon, il devient vraiment difficile de suivre à la fois la fonction de rappel et l'exécution post-callback.

+0

la méthode est un contrôleur abstrait pour rendre cette méthode accessible par tous les différents protocoles que nous fournissons à notre API allant de IRC à http, à socket.io thats pourquoi il y a ce paramètre de rappel mystérieux et vague. dans ce cas, c'est le contrôleur lui-même responsable de l'envoi des mises à jour. le rappel est pour l'initiateur de l'action pour recevoir une réponse du contrôleur. – r3wt