socket.io 角度错误:未捕获的 TypeError:无法调用 null 的方法“onClose”

Posted

技术标签:

【中文标题】socket.io 角度错误:未捕获的 TypeError:无法调用 null 的方法“onClose”【英文标题】:socket.io angular error: Uncaught TypeError: Cannot call method 'onClose' of null 【发布时间】:2013-12-23 17:26:11 【问题描述】:

我正在尝试按照此处的指南进行操作:

http://www.html5rocks.com/en/tutorials/frameworks/angular-websockets/

我将 node、express 和 socket.io 与 angularjs 一起使用。

当我加载 http://localhost:8000/donate 时,我在客户端收到以下错误:

Uncaught TypeError: Cannot call method 'onClose' of null [VM] socket.io.min.js (2806):2
(anonymous function)

相同的角度工厂模式:

app.factory('socket', [
'$rootScope'
    , '$log'
    , function (
        $rootScope
        , $log
        ) 

        var socket = io.connect();

        $log.log('socket', io, socket);

        return 
            on: function (eventName, callback) 
                socket.on(eventName, function () 
                    var args = arguments;
                    $rootScope.$apply(function () 
                        callback.apply(socket, args);
                    );
                );
            ,
            emit: function (eventName, data, callback) 
                socket.emit(eventName, data, function () 
                    var args = arguments;
                    $rootScope.$apply(function () 
                        if (callback) 
                            callback.apply(socket, args);
                        
                    );
                )
            
        ;
]);

节点 app.js

var express = require('express')
    , app = express()
    , server = require('http').createServer(app)
    , socket = require('./routes/socket.js')
    , io = require('socket.io').listen(server);

...

//sockets
io.sockets.on('connection', socket.version);

和 ./routes/socket.js

var socket = module.exports = 
    , c = console;

socket.version = function(sock)
    var pkg = require('../package.json');

    var version = pkg.version;

    c.log('socket', sock, version);

    sock.emit('send:version', 
        version: version
    );

    setInterval(function () 
        sock.emit('send:time', 
            time: (new Date()).toString()
        );
    , 1000);
;

最后是我使用的角度控制器:

app.controller('DonateCtrl', [
    '$scope'
    , '$rootScope'
    , 'socket'
    , '$log'
    , function(
        $scope
        , $rootScope
        , socket
        , $log
    ) 

        socket.on('send:version', function (data) 
            $log.log('send:version', data);
            $scope.version = data.version;
        );

        socket.on('send:time', function (data) 
            $log.log('send:time', data);
        );

        $scope.$watch('version', function(newVal, oldVal)
           $log.log('version', newVal, oldVal);
        );

        $scope.$on('socket:error', function (ev, data) 
            $log.log('socket:error', ev, data);
        );
]);

【问题讨论】:

Uncaught TypeError: Cannot call method 'onClose' of null的可能重复 【参考方案1】:

所以问题是我仍然在节点的 app.js 中使用 app.listen(port)

我需要将其更改为 server.listen(port, callback),然后一切都开始工作了 :)

参考:http://net.tutsplus.com/tutorials/javascript-ajax/real-time-chat-with-nodejs-socket-io-and-expressjs/

【讨论】:

以上是关于socket.io 角度错误:未捕获的 TypeError:无法调用 null 的方法“onClose”的主要内容,如果未能解决你的问题,请参考以下文章

加载socket.io.js时Node.js“未捕获的语法错误:意外的令牌<”

将 socket.io-client 与 webpack 一起使用时未定义 global

节点/角度应用程序未捕获的语法错误:意外的令牌 <

socket.io,io 未定义(JS 错误)

角度未捕获错误:无法解析服务的所有参数

如何解决 Socket.io 404(未找到)错误?