Is it possible to store messages in a socketio chat app - node.js

Let's say I made a complete UI of a chat app. We have a panel which contains all the recently contacted. We have react on the front-end and node, express on the backend. The real time data transfer chat is carried out using socketio.
The real question is how do I store all the messages that I have with each user. Let's say I chatted with user A for a while, closed the tab and moved to user B. Then the next day I moved back to the user A, I want all my previous chats with that user to be available to me.
How is that achievable?
One way I can wrap my head around is that I use mongoDB to create a chat room with two specific user and a id. Then I store that room on mongo with all the chats stored in an array.
On the client side, I check the db if a specific chat room exists. If it does, I send all the messages in to the client side, if not it create a new chat room.
This is by far the most sensible thing I've thought.
Any guidance as to what other techniques I can use?
Much appreciated.

Related

Private chat app which saves contacts/message history with MongoDB Nodejs Socket.io and Redux

I'm quite new with sockets so I came here to ask for some good practice ideas.
To understand better what I want to achieve here is my idea: I made a product creation page in react which has a seller and an option "Send message to the seller". After a buyer clicks to this button I want to make a private chat between the two user.
I want to save this socket connection and all of the messages between the users for both of them in my MongoDB database. So whenever a user simply leaves the site all of the recieved contacts/messages are saved and when he rejoins can continue the chat with the pre-loaded chat history.
So I thought about creating a messages collection and store socket details in document like this:
_id:ObjectId("123")
productId:1
sender:id1
reciever:id2
messages=[{1:"Hey},
{2:"Nice to meet you"} ...]
And here comes the redux part: When a user is logging in, I want to fetch all of the previous contacts and messages so he can continue chatting with them. But it would be time waisting to fetch the message history every single time, so I thought about using a redux store to get the contacts and history from database and store there. Like this
recievedmessages=[{_id:ObjectId("123")
productId:1
sender:id1
reciever:id2
messages=[{1:"Hey},{2:"Nice to meet you"} ...]},
{othermessage1 ...},
{othermessage2 ...},
]
sentMessages=[{sentmessag1, sentmessage2, sentmessage3}]
And when a buyer sends a new message to that user I update my redux store for the buyer, when the seller recives the message from the socket update for him too and lastly my chat history in my mongodb messages field for that specific document. --> I am not sure at this part to have to manage it
Is this a good practice or how should I make this to be effiecent and store data? Thanks in advance.

Is it possible to check if anyone has a certain browser link open and if not execute a function?

I am making a web app that involves the creation of several rooms (users create them). These rooms are then stored on an array on the server. Using react router each of these rooms are given their own unique url /roomCodeGoesHere. I want to periodically check the rooms to see if anyone is in it(I guess in this case has the browser open?) and if there is no one in it, to have the room be deleted from the array.
Is there any way I can go about doing this? (the only ways I can think of seem hacky and are probably not good practice)
You can monitor the user count within your server array (via put request or websocket on mount/unmount), and if the room empties conditionally delete it within the controller. A room should by default start with 1 occupancy since it needs a creator. If you don't want to delete the room right away, then do the same thing but create a setTimeout that conditionally clears itself unless someone new enters.
This chat app I made deletes a room at 0 users using the above method:
http://astral-chat-app.herokuapp.com/

NodeJS and Socket.io creating room with two users

I'm doing chat app and I want to do it real time. Chat will be for now between two users. When user access to chat it finds all messages between them and displays messages. I think I need to create room with two users and then store room id in database. But I'm new to socket.io and I need advice how to do it.
Try to take some already pretty wide used chat, like Slack, as example. Usually you need pretty same set of things, workplaces, channels, private messages (like room but for two users only), and have users sending text messages with some formatting or images or just any files. Just take it easy, plan and make it step by step.
Also take note, that for both parties have their chat view updated with new messages you need not only save message one user send to db, but also broadcast that message to everyone, involved in conversation.

Socket io rooms (MEAN stack)

I am building a buy and sell website that is built on MEAN stack. Im planning to use socket.io. So here's how my website will work
User will register and login
They can post an item either buy/sell
Other users can offer to the post (i'll use socket.io on this so that the user who posted the item will have a notification)
The poster will have an option to view the current offers, then they will choose who'll they accept.
Once they accept the offer, both the Poster and the User who offered will have a communication both of them (Chat room)
So when the poster accepted the offer of the customer, it will open a chat for them to communicate. So here's my question, i will use socket io rooms. Once the poster accepts the offer, both of them will join the room (so i'll generate a room for them and automatically join them) then this room will be saved to the MongoDB, then every message they'll send, it will be saved to the database. So that they can see the history of their message even though they logout.
Is this the best method?
Create a room for both of them (saved to DB)
Saved to database everytime they send a message to each other
Query the database when they login for list of the rooms the user has joined so that they could see the messages they have
That would probably be the best way to do it. Here is a similar question is there a good way to save socket.io message history it shows how to save the message history.
You do not have to save the messages, but if you would like to be able to see messages later, you should save every message to a database. If you do not save every message to a database, when you reload the page all previous messages will disappear.
If you want a free database, mongoLab will host small mongoose databases for free. Here is a good tutorial showing how to use mongoLab, it does not use socket.io, but it will probably be very easy to implement it.
Hope this helps! Feel free to ask any questions below.

Socket.IO multiple pages for same user/socket

I'm working on a multiplayer board game on Node.js/Socket.IO. The flow is the following :
user enters his name and is added to the lobby
user select a room and is added to it, then game starts when he is joined by another user.
This part is petty easy and I've done it before. However, I now need the user to be able to join multiple game rooms at the same time. pages are dynamically generated by express, and there's no issue opening many game pages, but I'm struggling with the socket implementation.
Can I use a single socket for multiple rooms (for the same user) or do I have to create a new socket per room?
I'd like the user to always be able to chat within the lobby while in game. How do I sort that out?
Thanks
However, I now need the user to be able to join multiple game rooms at the same time. pages are dynamically generated by express, and there's no issue opening many game pages [...] Can I use a single socket for multiple rooms (for the same user) or do I have to create a new socket per room?
Pages open separately by the user do not share any context with each other. There are some hacky ways (such as a Flash LocalConnection), but you never should rely on these. Therefore, each page requires its own connection to your server.
I'd like the user to always be able to chat within the lobby while in game. How do I sort that out?
However you want. That implementation is up to you. If you are currently using the Socket.IO "rooms" feature, I suggest not using it so you have maximum flexibility in your implementation.

Resources