Javascript 发送消息请求

Javascript 发送消息请求,javascript,node.js,sockets,socket.io,Javascript,Node.js,Sockets,Socket.io,我正在使用Socket.IO和Node.JS制作一个聊天应用程序。我想实现消息请求,比如已经实现的消息请求。我不知道如何解决这个问题 如果迈克想给杰克发私人信息,杰克必须首先接受迈克的信息请求。假设Mike使用Socket.IO连接到服务器,服务器处理他的请求。然后,Mike可以向服务器发送套接字,例如,聊天套接字,如下所示: socket.emit( 'chat', { // Emits the 'chat' socket to the server name: 'Mike', //

我正在使用Socket.IO和Node.JS制作一个聊天应用程序。我想实现消息请求,比如已经实现的消息请求。我不知道如何解决这个问题

如果迈克想给杰克发私人信息,杰克必须首先接受迈克的信息请求。假设Mike使用Socket.IO连接到服务器,服务器处理他的请求。然后,Mike可以向服务器发送套接字,例如,聊天套接字,如下所示:

socket.emit( 'chat', { // Emits the 'chat' socket to the server
    name: 'Mike', // Sets the name of the sender
    receiver: 'Jake', // Sets the name of the receiver
    message: 'Hey Jake!' // Sets the message
} );
现在,很明显,只有当Jake已经接受了消息请求时,才应该发送这个套接字(如果有的话)。这就是问题所在。
消息请求存储在数据库中(这是我的应用程序所必需的)

关于如何实现这一点,我有一些想法:

  • 每次用户发送聊天套接字时都要查询数据库,以查看接收者是否接受发送者的请求。当然,这意味着每次发送聊天时,我都有一个数据库查询。这对我来说似乎效率很低
  • 以某种方式查询数据库一次,并允许聊天信息在每次都不发出数据库查询的情况下通过——尽管我不确定如何实现这一点——因此出现了这个问题

  • 我希望你能在这个问题上提供意见。谢谢

    您提到的请求是,请求接受应该只发生一次,就像在facebook中一样,或者应该为发送的每条消息接受一次请求

    我希望只有一次,当第一条信息发出时。如果是这种情况,那么您可以创建一个JSON文件,其中包含Jake的朋友(Jake接受的人)的数组。每当有人试图向Jake发送消息时,您只需参考Jake的数组中的JSON文件,查看发送者是否在数组列表中。如果是,您可以继续向Jake广播消息。如果不在阵列中,则从发送方(Mike)向Jake发送连接请求

    因为您将消息请求存储在数据库中,所以当有人接受新的连接请求时,更新JSON文件数组


    我希望这对你有帮助。如果我不在您的范围内,请在下面发表评论。

    有多种方法

    1) 您可以完成缓存(如@PM-77-1所述),这有助于减少数据库查询的数量。Redis缓存非常容易与Node.js一起使用。所以,当你试图检查迈克是否有杰克作为朋友时,你可以首先在缓存级别检查杰克是否在迈克的朋友列表中。如果Mike的朋友列表不可用,您可以从db中获取一次,并将其存储在缓存中以备将来使用


    2) 您还可以允许用户(Mike)发送大约100到200条短消息(仅举一个例子),这些消息将为Jake隐藏,直到Jake接受Mike的请求。限制迈克在不交朋友的情况下可以发送的消息数量是一个主观问题,这取决于它的知名度

    看看这是否有帮助:@PM77-1很有趣,我会在一分钟内阅读:)谢谢你的回答:)我很可能会使用缓存来解决这个问题。另外,如果我错了,请纠正我,但我认为你的第二个想法在存储空间和可扩展性方面有点低效:)这是一个主观的争论。大多数公司都试图对用户友好,所以他们不喜欢阻止用户采取某些行动,而是在行动后向他们显示一条很好的消息,说明用户不会马上收到。Whatsapp就是这样,Facebook以前也做过。此外,如果是文本数据,存储也不是一个大问题。图像和视频文件仍被视为一个问题。请求只应发送一次,是的。我曾考虑过这样做,但在后期制作中,在文件中包含这样的信息似乎相对容易出错——缓存听起来更安全。如果你喜欢缓存,那是最好的方法。