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“未捕获的语法错误:意外的令牌<”