2016-07-11 14 views
0

In meinem Verständnis wird der folgende Code das Dokument löschen und es auch als zweites Argument für den Rückruf zurückgeben. Ist das wahr? Ich finde viele widersprüchliche Informationen im Internet. Ich habe einen ähnlichen Ansatz verwendet, aber wenn es einen besseren Ansatz gibt, bin ich bereit, das anzupassen. Ich muss das Dokument löschen und auch auf zwei seiner Felder zugreifen: _id und conversation respektvoll. Danke, ich werde auflegen und zuhören.Verwirrung über findOne() und 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() }); 

    }); 

}, 

Um zu klären Dies ist eine abstrakte Controller-Schnittstelle für weitere Implementierung spezifische APIs. im Grunde normalisiert es diesen Vorgang über alle Protokolle, die wir unterstützen oder in Zukunft unterstützen werden.

Hier ist ein Beispiel dafür, wie diese Methode von socket.io verwendet wird:

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}); 
    }); 
}); 

so ja, alle Aktualisierungen dieser Controller-Methode sendet in dem Verfahren gehören und nicht in den Rückruf. Der Rückruf ist nur für den Initiator. nichts anderes.

Antwort

0

Ihre Methode ist absolut korrekt, aber IMHO würde ich diesen Weg bevorzugen. Sieht logischer und sequentieller aus.

Ich fühle, dass, sobald Sie den Rückruf anrufen, sollte nichts darauf folgen. Sonst wird es sehr schwierig, sowohl die Callback-Funktion als auch die Ausführung nach dem Callback zu verfolgen.

+0

Die Methode ist ein abstrakter Controller, um diese Methode von allen verschiedenen Protokollen zugänglich zu machen, von denen wir unsere API bereitstellen. Das reicht von IRC über http bis socket.io, deshalb gibt es diesen mysteriösen und vagen Callback-Parameter. in diesem Fall ist der Controller selbst dafür verantwortlich, die Updates zu versenden. Der Rückruf ist für den Initiator der Aktion, um eine Antwort von der Steuerung zu erhalten. – r3wt