你如何使用不同的发射将数据发送到套接字?

时间:2021-04-19 12:27:05

标签: javascript websocket socket.io

我想使用 socket.io 将数据发送到 2 个不同的组件,现在第一个发出工作但第二个甚至没有被激活,我试图在 io.on 函数中反转它们的顺序,并且只有第一个写入的作品。第二个是否在等待第一个发射结束?我怎样才能让它们并行工作?

这是我的代码:

import {createServer} from "http";
import socketIo from "socket.io";
import express from "express";
import cors from "cors";
import mongoose from "mongoose";
import { MONGODB_URL } from "./config/config";
import jwt from "jsonwebtoken";
import { watchLeaves } from "./database/controllers/LeaveControllers";
import { watchCalendars } from "./database/controllers/calendarControllers";

const port = process.env.PORT || 3333;

mongoose.connect(MONGODB_URL, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
});

const db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", () => {
    console.log("Connected to database");
});

const app = express();
app.use(cors());
app.get("/", (req, res) => {
    res.send({ response: "I am a websocket!" }).status(200);
});

const verifySocketAuth = (header) => new Promise((resolve, reject) => {
    if (typeof header !== "undefined") {
        const headerArray = header.split(" ")
        const token = headerArray[1]
        return jwt.verify(token, "Bearer", (err, auth) => {
            if (err) reject(new Error(err))
            else resolve(auth)
        })
    }
})

const server = createServer(app);

const io = socketIo(server, {
    cors: {
        origin: "*",
        methods: ["GET", "POST"],
    }
});

io.use(async (socket, next) => {
    const header = socket.handshake.headers["authorization"];
    await verifySocketAuth(header)
    console.log("token", await verifySocketAuth(header))
    next()
});

const getLeavesAndEmit = async (socket) => {
    const lastRecord = await watchLeaves();
    socket.emit("FromLeaves", lastRecord);
};

const getCalendarsAndEmit = async (socket) => {
    const lastRecord = await watchCalendars();

    console.log("last record calendars==>", lastRecord);
    socket.emit("FromCalendars", lastRecord);
};
io.on("connection", async (socket) => {
    console.log("Client connected");
    
    await getLeavesAndEmit(socket);
    await getCalendarsAndEmit(socket);

    socket.on("disconnect", () => {
        console.log("Client disconnected");
    });
});

server.listen(port, () => console.log(`Soket Server listening on ${port}`));

1 个答案:

答案 0 :(得分:1)

我猜 socket.emit 不会返回 Promise,因此当您执行 await getLeavesAndEmit(socket) 时,您正在等待永远无法解决的事情。 socket.emit 后尝试从异步函数返回一些静态内容,例如 return "done"