Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何用不同的方法将数据发送到套接字?_Javascript_Websocket_Socket.io - Fatal编程技术网

Javascript 如何用不同的方法将数据发送到套接字?

Javascript 如何用不同的方法将数据发送到套接字?,javascript,websocket,socket.io,Javascript,Websocket,Socket.io,我想使用socket.io将数据发送到两个不同的组件,现在第一个emit可以工作,但第二个甚至没有激活,我尝试在io.on函数中反转它们的顺序,只有第一个写入的可以工作。第二个正在等待第一个发射结束吗?如何使它们并行工作 这是我的代码: import {createServer} from "http"; import socketIo from "socket.io"; import express from "express"; i

我想使用socket.io将数据发送到两个不同的组件,现在第一个emit可以工作,但第二个甚至没有激活,我尝试在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}`));

我猜,
socket.emit
不会返回承诺,所以当你等待getLeavesAndEmit(socket)时,你正在等待一些永远无法解决的问题。在
socket.emit
之后,尝试从异步函数返回一些静态的东西,比如
返回“done”

我猜
socket.emit
不会返回承诺,所以当您执行
等待getLeavesAndEmit(socket)
时,您正在等待一些永远无法解决的东西?在
socket.emit之后
尝试从异步函数返回一些静态值,比如
返回“完成”
@JeremyThille omg谢谢!!!它起作用了:DOh nice:)那是在黑暗中拍摄的。我已将其作为答案发布,因此您可以将其标记为已接受。