2015-03-23 2 views
0

Я пытаюсь сделать видео-приложение webrtc. В коде клиента, у меня есть это:WebRTC, socket.io, node.js: Не удается прочитать свойство «emit» неопределенного?

getUserMedia(constraints, handlemedia, errorhandle); 
constraints = {video: true}; 
function handlemedia(stream){ 
    //other stuff I do here 

    document.getElementById("connect").addEventListener("click", function(e){ 
     var socket = io.connect(); 
    } 

    var servers = {"iceServers": [{ "url": "stun:localhost:2013"}]}; 
    pc = new RTCPeerConnection(servers); 
    pc.onicecandidate = function (evt, socket) { 
     console.log("THIS IS THE evt.candidate: ", evt.candidate); 
     somecandidate = evt.candidate; 
     socket.emit("candidate", somecandidate); 
    }; 
    pc.addStream(localStream); 
    function gotDescription(desc, socket) { 
     console.log("WE GOT THE DESC."); 
     pc.setLocalDescription(desc); 
     socket.emit("sdp", desc); 
    } 

    document.getElementById("createoffer").addEventListener("click", function(e){ 
     pc.createOffer(gotDescription); 
    }); 
} 

А потом в server.js (в node.js) код у меня есть:

var io = require('socket.io').listen(app); 
io.sockets.on('connection', function(socket){ 
    socket.on("candidate", function(somecandidate){ 
    console.log("GOT CANDIDATE."); 
    }); 

    socket.on("sdp", function(desc){ 
    console.log("Got desc"); 
    }); 
}); 

Я понимаю, что я только с помощью кнопок прямо сейчас , но на данный момент я просто могу проверить это. Мне просто нужно снять всю эту вещь.

Поэтому, если я запустил этот код, он говорит в консоли браузера «Невозможно прочитать свойство« испускать »неопределенного. Так что, очевидно, ему не нравится файл socket.emit. Почему бы и нет? Что ему не нравится в сокете .emit?

+1

Вы пытались иметь сокет var вне функции, чтобы вы могли назначить его в этой функции и использовать его позже на pc.onicecandidate? На этом этапе он не определен. – Dslayer

ответ

0
document.getElementById("connect").addEventListener("click", function(e){ 
var socket = io.connect(); 
} 

var прицелы переменные внутри функции, в которой она определена. socket здесь видна только внутри этой функции.

pc.onicecandidate = function (evt, socket) { 
    console.log("THIS IS THE evt.candidate: ", evt.candidate); 
    somecandidate = evt.candidate; 
    socket.emit("candidate", somecandidate); 
}; 

выше var socket не видно здесь так socket будет undefined.

Так что в вашем случае кнопки на самом деле затрудняют его использование. Вы бы лучше не использовать их вообще:

getUserMedia(constraints, handlemedia, errorhandle); 
constraints = {video: true}; 
function handlemedia(stream){ 
    //other stuff I do here 

    var socket = io.connect(); 

    // Start the RTCPeerConnection and candidate gathering 
    // after we've done io.connect() 
    var servers = {"iceServers": [{ "url": "stun:localhost:2013"}]}; 
    pc = new RTCPeerConnection(servers); 

    pc.onicecandidate = function (evt, socket) { 
     console.log("THIS IS THE evt.candidate: ", evt.candidate); 
     somecandidate = evt.candidate; 
     socket.emit("candidate", somecandidate); 
    }; 
    pc.addStream(localStream); 
     function gotDescription(desc, socket) { 
     console.log("WE GOT THE DESC."); 
     pc.setLocalDescription(desc); 
     socket.emit("sdp", desc); 
    } 

    pc.createOffer(gotDescription); 
} 

Если вы действительно хотите, кнопки, затем обернуть все это выше в функции, которые вы будете использовать в качестве обработчика щелчка вместо того, чтобы просто положить var socket = io.connect() в только обработчик.