node.js - socket.io Angular 错误: Uncaught TypeError: Cannot call method 'onClose' of null

标签 node.js angularjs socket.io

我正在尝试遵循此处的指南:

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)

相同的 angular.factory 模式:

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);
                        }
                    });
                })
            }
        };
}]);

Node 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);
};

最后是我使用它的 Angular Controller :

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);
        });
}]);

最佳答案

所以问题是我仍然在 Node 的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/

关于node.js - socket.io Angular 错误: Uncaught TypeError: Cannot call method 'onClose' of null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20422581/

相关文章:

javascript - 为经过身份验证的用户隐藏/显示元素的指令

javascript - 将新消息添加到已索引的对象

node.js - Socket.io - React : How to retrieve saved socket. io 数据(MongoDB)?

javascript - 如何在 Swig 模板中调用标准的 javascript 函数?

javascript - 如何运行我从 github 导入的这个 Node 应用程序?

node.js - node_redis 更新已用内存信息

javascript - 处理数组时出现未定义错误

javascript - AngularJS:使用 ng-if 在指令中选择部分模板

javascript - 通过 socket.io 添加 ssl 后无法发出消息

node.js - 如何以驼峰式风格返回sequelize查询的结果集?