2016-07-11 7 views
0

私の理解では、以下のコードはドキュメントを削除し、それをコールバックの2番目の引数として返します。これは本当ですか?私はインターネット上で矛盾する情報をたくさん見つけています。私は前に同様のアプローチを使用しましたが、より良いアプローチがあればそれを適応させていきます。私はその文書を削除し、そのフィールドのうちの2つ、すなわち_idconversationにもアクセスする必要があります。ありがとう、私はハングアップし、聞くよ。以上の実装固有のAPIによって使用されるためを明確にfindOne()と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() }); 

    }); 

}, 

これは、抽象コントローラインタフェースです。基本的には、私たちがサポートしているか、将来サポートするプロトコルでこの操作を正規化します。ここで

は、このメソッドは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}); 
    }); 
}); 

ので、はい、すべての更新このコントローラのメソッドは、メソッドではなく、コールバックに属してください送信します。コールバックはイニシエータに対してのみ行われます。他には何もない。

答えて

0

あなたの方法は間違いありませんが、この方法をとってみたいと思います。より論理的で逐次的に見えます。

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

function callback(err, msg) { 
    if (err) { 
     throw err; 
    } 
    io.to('convo_'+removed.conversation.toString()).emit('messaging.messageDeleted',{ message: removed._id.toString() }); 
} 

コールバックを呼び出すと、それに続くものはありません。それ以外の場合は、コールバック関数とポストコールバックの両方の実行を追跡することが本当に困難になります。

+0

このメソッドは、私たちがapiを提供するさまざまなプロトコル(IRCからhttp、socket.ioまで)にアクセスできるようにするための抽象的なコントローラです。なぜなら、この不思議で曖昧なコールバックパラメータがあるからです。この場合、コントローラは更新を送信するために自己責任を負います。コールバックは、アクションのイニシエータがコントローラからの応答を受け取るためのものです。 – r3wt

関連する問題