代码之家  ›  专栏  ›  技术社区  ›  Ashh

显示交付的和蓝色勾号一样的whats应用程序

  •  5
  • Ashh  · 技术社区  · 7 年前

    我已经用socket创建了一个应用程序。。。我可以使用套接字连接管理两个人之间的对话。

    这是密码

    用户模型

    const schema = new Mongoose.Schema({
      firstName: { type: String, default: '', trim: true },
      lastName: { type: String, default: '', trim: true }
    })
    

    const schema = new Mongoose.Schema({
      name: { type: String, trim: true },
      type: { type: String, required: true, enum: ['G', 'P'] },
      members: [{ type: Schema.Types.ObjectId, ref: 'Users' }]
    }, { timestamps: true })
    

    消息模型

    const schema = new Mongoose.Schema({
      conversationId: { type: Schema.Types.ObjectId, ref: 'Conversations' },
      body: { type: String, trim: true },
      author: { type: Schema.Types.ObjectId, ref: 'Users' }
    }, { timestamps: true })
    

    io.on('sendMessage', async(action2) => {
        action2.author = socket.decoded.id
        action2.markRead = markReadSocket
        const createMessage = await Message.create(action2)
        const messages = await Message.aggregate([
          { "$match": { "_id": mongoose.Types.ObjectId(createMessage._id) } },
          { "$lookup": {
            "from": "users",
            "let": { "author": "$author" },
            "pipeline": [
              { "$match": { "$expr": { "$eq": [ "$_id", "$$author" ] }}},
              { "$project": { "firstName": 1, "lastName": 1, "avatar": 1 } }
            ],
            "as": "author"
          }},
          { "$unwind": "$author" },
          { "$project": {
            "author": 1, "markRead": 1, "isDelivered": 1,
            "body": 1, "conversationId": 1,
            "isIncoming": { "$ne": [ "$author._id", mongoose.Types.ObjectId(socket.decoded.id) ] },
          }}
        ])
        io.emit(action2.conversationId, messages)
      })
    

    以上代码对一对一对话和小组对话都很有效。

    readBy deliveredTo time userId 在里面?

    我怎么能用这个 nodejs socketio ? 如果有人以前做过,请张贴你的代码,我会设法理解它。

    任何帮助都将不胜感激!!!

    3 回复  |  直到 7 年前
        1
  •  3
  •   nkshio    7 年前

    客户端

    伪码

    1. Register handler for 'newMessage' event, this will emit 'received' event
    2. Function to emit 'markSeen' event, this will execute when the message is opened (chat window)
    3. Register handler for 'delivered' event, this will display 'grey' ticks
    4. Register handler for 'markedSeen' event, this will display 'blue' ticks
    

    // Handler for 'newMessage' event
    socket.on('newMessage', function(message) {
        chatMessages[message.MESSAGE_ID] = message;
    
        var options = {
            messageID: message.MESSAGE_ID,
            timetoken: moment().valueOf()
        };
    
        // Emit 'received' event
        socket.emit('received', options);
    });
    
    // function to emit 'markSeen' event
    function markSeen(message) {
        var options = {
            messageID: message.MESSAGE_ID
        };
    
        // Emit 'markSeen' event
        socket.emit('markSeen', options);
    }
    
    // Handler for 'delivered' event
    socket.on('delivered', function(message) {
        chatMessages[MESSAGE_ID].delivered = true;
    });
    
    // Handler for 'markedSeen' event
    socket.on('markedSeen', function(message) {
        chatMessages[MESSAGE_ID].seen = true;
    });
    

    服务器端

    伪码

    1. Register handler for 'received' event, this will emit 'delivered' event
    2. Register handler for 'markSeen' event, this will emit 'markedSeen' event
    

    功能

    // Handler for 'received' event
    io.on('received', function(options) {
        var options = {
            timetoken: moment().valueOf(),
            userID: options.message.SENDER_ID,
            messageID: options.message.MESSAGE_ID
        };
    
        // Emit 'delivered' event
        socket.emit('delivered', options);
    });
    
    // Handler for 'markSeen' event
    io.on('markSeen', function(options) {
        var options = {
            timetoken: moment().valueOf(),
            userID: options.message.SENDER_ID,
            messageID: options.message.MESSAGE_ID
        };
    
        // Emit 'markedSeen' event
        socket.emit('markedSeen', options);
    });
    
        2
  •  3
  •   hsz    7 年前

    交付 收到此消息后立即执行。如果此消息已打开,请发送另一个事件 主题。两个事件都必须包含消息id。

    在服务器端,在接收到上述事件后,检查消息的发送者是否得到并传递了正确的事件没有通知发送者消息的当前状态。

        3
  •  1
  •   Prodigle    7 年前

    你需要两个不同的东西,你需要跟踪。一旦服务器收到消息。当您将其添加到数据库时,在它的控件中,您将把传递的tick设置为true。此时,您可以将消息发送回发送web套接字,告诉它它们的消息已传递到服务器,然后客户端发送者可以设置其灰色勾号。

    推荐文章