Javascript 关于locahost的PeerJs问题
我正在尝试使用peerjs通过WebRTC实现zoom clone,问题是Javascript 关于locahost的PeerJs问题,javascript,node.js,express,webrtc,peerjs,Javascript,Node.js,Express,Webrtc,Peerjs,我正在尝试使用peerjs通过WebRTC实现zoom clone,问题是myPeer.on(“call”,(call)=>{它从未调用过,这同一个代码正在locahost上执行,对于编写zoom clone教程的其他人,我不确定我的代码哪里有问题 虽然它不在本地主机上工作,但是它在heroku上工作,所以我的本地主机设置的问题在哪里,为什么我没有让其他用户在本地主机上加入会议室,我不理解 script.js 常量套接字=io(“/”); const videoGrid=document.g
myPeer.on(“call”,(call)=>{
它从未调用过,这同一个代码正在locahost上执行,对于编写zoom clone教程的其他人,我不确定我的代码哪里有问题
虽然它不在本地主机上工作,但是它在heroku上工作,所以我的本地主机设置的问题在哪里,为什么我没有让其他用户在本地主机上加入会议室,我不理解
script.js
常量套接字=io(“/”);
const videoGrid=document.getElementById(“视频网格”);
const myPeer=新对等(未定义{
路径:“/peerjs”,
主持人:“/”,
端口:“3030”,
});
让我的视频流;
const myVideo=document.createElement(“视频”);
myVideo.muted=true;
const peers={};
navigator.mediaDevices
.getUserMedia({
视频:没错,
音频:是的,
})
。然后((流)=>{
myVideoStream=流;
添加视频流(myVideo,stream);
//从来没给我的同伴打过电话
myPeer.on(“呼叫”,“呼叫)=>{
呼叫.应答(流);
const video=document.createElement(“视频”);
call.on(“流”,“用户视频流)=>{
添加视频流(视频,用户视频流);
});
});
socket.on(“用户已连接”,(userId)=>{
日志(“用户连接”,用户ID);
connectToNewUser(用户标识,流);
});
//输入值
让文本=$(“输入”);
//按enter键时发送消息
$(“html”).keydown(函数(e){
if(e.which==13&&text.val().length!==0){
emit(“message”,text.val());
text.val(“”);
}
});
socket.on(“createMessage”(消息)=>{
$(“ul”).append(`li class=“message”>user
${message}`);
scrollToBottom();
});
});
socket.on(“用户已断开连接”,(userId)=>{
如果(peers[userId])peers[userId].close();
});
myPeer.on(“打开”,id)=>{
插座发射(“连接房间”,房间ID,ID);
});
函数connectToNewUser(用户ID,流){
const call=myPeer.call(userId,stream);
const video=document.createElement(“视频”);
call.on(“流”,“用户视频流)=>{
添加视频流(视频,用户视频流);
});
call.on(“关闭”,()=>{
video.remove();
});
对等方[userId]=呼叫;
}
函数addVideoStream(视频,流){
video.srcObject=流;
video.addEventListener(“loadedmetadata”,()=>{
video.play();
});
附加(视频);
}
常量scrollToBottom=()=>{
变量d=$(“.main_uu聊天窗口”);
d、 滚动顶部(d.prop(“滚动高度”);
};
常量mutenmute=()=>{
const enabled=myVideoStream.getAudioTracks()[0]。已启用;
如果(已启用){
myVideoStream.getAudioTracks()[0]。enabled=false;
setUnmuteButton();
}否则{
setMuteButton();
myVideoStream.getAudioTracks()[0]。enabled=true;
}
};
常量播放停止=()=>{
控制台日志(“对象”);
let enabled=myVideoStream.getVideoTracks()[0]。已启用;
如果(已启用){
myVideoStream.getVideoTracks()[0]。enabled=false;
setPlayVideo();
}否则{
setStopVideo();
myVideoStream.getVideoTracks()[0]。enabled=true;
}
};
常量setMuteButton=()=>{
常量html=`
哑巴
`;
document.querySelector(“.main\u mute\u button”).innerHTML=html;
};
const setUnmuteButton=()=>{
常量html=`
取消静音
`;
document.querySelector(“.main\u mute\u button”).innerHTML=html;
};
const setStopVideo=()=>{
常量html=`
停止录像
`;
document.querySelector(“.main\u video\u按钮”).innerHTML=html;
};
const setPlayVideo=()=>{
常量html=`
播放视频
`;
document.querySelector(“.main\u video\u按钮”).innerHTML=html;
}
函数connectToNewUser
在myPeer.on('call')之前执行。
尝试将函数修改为
socket.on("user-connected", (userId) => {
console.log("User Connected", userId);
//connectToNewUser(userId, stream);
setTimeout(connectToNewUser,1000,userId,stream)
});
我也遇到了同样的问题,这似乎是socket.emit(“join-room”,room_-ID,ID);的竞争条件 服务器将发出
socket.to(roomId).broadcast.emit(“用户已连接”,userId);
这将在用户完成导航承诺之前触发调用connectToNewUser中的对等方的函数
我解决了这个问题,确保在启动socket.emit(“join room”,room_ID,ID);
之前导航器承诺已经完成