Express Jsでリアルタイムチャットアプリを作るSocket.Ioのコード
require("dotenv").config();
const express = require("express");
process.env.TZ = "Asia/Kolkata";
const bodyparser = require("body-parser");
const cookieparser = require("cookie-parser");
const mongoose = require("mongoose");
const config = require("./src/Config/db").get(process.env.NODE_ENV);
let cors = require("cors");
const allowedOrigins = [
"http://localhost:3000",
];
const corsOptions = {
origin: allowedOrigins,
credentials: true,
optionSuccessStatus: 200,
};
const app = express();
PORT = 8000;
app.use(cors(corsOptions));
app.use(bodyparser.urlencoded({ extended: false }));
app.use(bodyparser.json());
app.use(bodyparser.text({ type: "text/html" }));
app.use(cookieparser());
app.use("/public", express.static(path.join(__dirname, "public")));
mongoose.set("strictQuery", true);
mongoose.Promise = global.Promise;
mongoose
.connect(config.DATABASE, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log("データベースに接続しました!");
})
.catch((err) => {
console.log("データベースへ接続できませんでした!");
});
app.get("/", (req, res) => {
return res.send("ようこそ");
});
const server = app.listen(PORT, (error) => {
if (!error) console.log("サーバーがPORT: ", PORT, "で稼働中です。");
else console.log("エラー発生、サーバーが起動できませんでした", error?.message);
});
const io = require("socket.io")(server, {
pingTimeout: 60000,
cors: {
origin: allowedOrigins,
methods: ["GET", "POST", "PUT", "DELETE"],
credentials: true,
},
});
global.onlineUsers = new Map();
io.on("connection", (socket, req) => {
global.chatSocket = socket;
socket.on("join", (id) => {
onlineUsers.set(id, socket.id);
onlineUsers.set(socket.id, id);
const newUsers = Array.from(onlineUsers.keys());
setTimeout(() => {
io.emit("online", newUsers);
}, 1000);
});
socket.on("typing", (user) => {
const receiver = onlineUsers.get(user.receiver);
if (receiver) {
socket.to(receiver).emit("typing", user);
}
});
socket.on("stop-typing", (user) => {
const receiver = onlineUsers.get(user.receiver);
if (receiver) {
socket.to(receiver).emit("stop-typing", user);
}
});
socket.on("send", (message) => {
const receiver = onlineUsers.get(message.receiver);
if (receiver) {
socket.to(receiver).emit("receive", message);
}
});
socket.on("disconnect", () => {
const key = onlineUsers.get(socket.id);
if (key) {
onlineUsers.delete(key);
onlineUsers.delete(socket.id);
}
const remainingUsers = Array.from(onlineUsers.keys());
setTimeout(() => {
socket.broadcast.emit("online", remainingUsers);
}, 1000);
});
});
全画面表示を終了する
詳細はこちら - https://freecodez.com/post/074niht
ありがとう!
こちらの記事はdev.toの良い記事を日本人向けに翻訳しています。
https://dev.to/freecodez/socketio-code-to-create-a-realtime-chat-application-in-express-js-24p8