如何在客户端JS上获取 socket.io 的查询字符串?

How to get the query string on client side JS for socket.io?

提问人:FiFi 提问时间:9/3/2021 最后编辑:FiFi 更新时间:9/3/2021 访问量:177

问:

我会尽量详细。我正在使用 Express、Node.js 和 Mongoose 构建一个聊天应用程序,朋友们可以在其中亲自互相发送消息。我有一个活动用户列表(呈现在线用户),从列表中,我想单击我要发送消息的用户以发送个人消息。

我的方法是:当我单击用户时,页面会生成一个包含该特定用户 ID 的查询字符串,因此它具有接收者 ID,而我有发送者 ID。所以,我可以发送消息。

但是,由于某种原因,我无法从客户端 JS 或通过 socket.io 在客户端和服务器端监听查询字符串以捕获接收方 ID? 现在,我的代码是这样存在的: 服务器端 socket.io:

let http=require("http");   //for socket.io
let socketio=require("socket.io");

let users={};
let send=[];
io.on("connection", async (socket)=>{
    console.log("new WS connection");
    socket.on("login", async function(user_id){
        socket.handshake.session.user_id = user_id;
        socket.handshake.session.save();
        
    });

    socket.on("logout", function(user_id){
        if(socket.handshake.session.user_id){
            delete socket.handshake.session.user_id;
            socket.handshake.session.save();
        }
    });

    socket.on("disconnect", async ()=>{

    })

    socket.on("chatMsg", async msg => {
        let sender = await User.findById(socket.handshake.session.user_id);
        io.emit("chatMsg", utils.formatMessage(sender.name, msg));
    })

})

客户端 socket.io:

let chatForm=document.querySelector("#chat-form");
let fullMessageBox=document.querySelector(".full-message-box");
// let ul=document.querySelector(".the-ul");
let li=document.querySelectorAll(".active-people-li");
let div2=document.querySelector(".active-people");
let socket=io();
let record=[];

socket.on("chatMsg", message=>{
    outputMessage(message);  //Outputs message to DOM
    fullMessageBox.scrollTop=fullMessageBox.scrollHeight;

});

chatForm.addEventListener("submit", (event)=>{
    event.preventDefault();
    let msgInput=document.querySelector("#msg-input").value;
    socket.emit("chatMsg", msgInput);
    document.querySelector("#msg-input").value="";
    document.querySelector("#msg-input").focus();
})

function outputActiveUsers(msg){  //Outputs list of active users and generates the query string
    console.log("receiver ID", msg.id);
    console.log("receiver socket id", socket.id);
    let li=document.createElement("li");
    li.classList.add("active-people-li");
    li.innerHTML= `<div class="active-sidebar">
                        <div class="div-of-img">
                            <img src="../files/profile.png" alt="" class="active-profile-img">
                        </div>
                        <div>
                            <a href="?receiverID=${msg.id}"><h4>${msg.name}</h4></a>
                            <h5>Hi. Is this you, bro?</h5>
                        </div>
                    </div>`;
    document.querySelector(".the-ul").appendChild(li);
    
}
JavaScript 节点.js Express socket.io

评论


答:

0赞 leonllr 9/3/2021 #1

我认为您可以尝试通过套接字事件发送查询字符串

评论

0赞 FiFi 9/3/2021
它第一次就起作用了。但是,在那之后,它就没有了。为什么?我已经添加了代码。如果我缺少任何需要上传的信息,请告诉我,我会对其进行编辑。因为函数 outputActiveUsers 生成查询字符串,但它在客户端连接和断开连接时被调用,所以它为什么会搞砸,也许?所以,它不起作用
0赞 Tyler2P 9/3/2021
这并不能真正为问题提供答案。一旦你有足够的声誉,你就可以对任何帖子发表评论;相反,提供不需要提问者澄清的答案
0赞 FiFi 9/3/2021
有没有办法在生成查询字符串后立即捕获?
0赞 leonllr 9/4/2021
链接我在这里看到了一些关于这一点@FiFi
0赞 FiFi 9/4/2021
我找不到正确的方法。如果您知道可以做些什么,请更新您的答案。这将意味着很多。我已经找了 3 天了