不能对socket.io使用非匿名方法," listener"参数必须是一个函数

时间:2017-04-14 15:07:39

标签: javascript node.js socket.io

我搜索了这个(简单?)问题的答案,然而,我找不到任何清楚的答案。

我是一个试图适应网络市场的java开发者,但是,作为一个OOP,很多东西都让我感到厌烦。

io.sockets.on('connection', function (socket) {
    console.log("Client has connected! id = [" + socket.id + "]");

    socket.on('disconnect', onPlayerDisconnected(socket));
});

function onPlayerDisconnected(socket) {
    socket.broadcast.emit('player_disconnected', socket.id);

    console.log("Client has disconnected! id = [" + socket.id + "]");
}

这是堆栈跟踪:

events.js:219
    throw new TypeError('"listener" argument must be a function');
    ^

TypeError: "listener" argument must be a function

如果我使用匿名功能,它就像一个魅力。问题是,如果我对(增加的)事件数做出反应,代码将无法维持。

那么,有没有办法将代码分解为更小的函数?

奖金问题:事件是否可以将代码拆分为多个.js文件?

非常感谢,
node.js初学者。

1 个答案:

答案 0 :(得分:3)

您正在将onPlayerDisconnected函数的结果(看似undefined,因为没有返回任何内容)传递给socket.on('disconnect')处理程序而不是实际函数{{1}这就是它正在寻找的东西。

更改传递onPlayerDisconnected

结果的以下代码

onPlayerDisconnected(socket)

此代码只传递实际函数socket.on('disconnect', onPlayerDisconnected(socket));

onPlayerDisconnected