【问题标题】:Socket.io TypeError: undefined is not a functionSocket.io TypeError:未定义不是函数
【发布时间】:2016-01-14 12:44:00
【问题描述】:

我正在制作一个简单的聊天应用程序。连接,“loggin in”并发送聊天消息就可以了。但是,当我刷新页面并尝试再次登录时,出现错误;

socket 上缺少错误处理程序。
TypeError: undefined is not a function at Socket. '
[ . . . ] 在 server.js:30:19

服务器.js

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var path = require('path');

var users = [];
var chat_history = [];

[...]

io.on('connection', function(socket){
    //
    // LOGIN
    ///////////////////////////
    socket.on('login', function(username) {
        if(!socket.username && username) {
            socket.emit('logged_in', 'successful');
            socket.emit('chat_history', JSON.stringify(chat_history));
            io.emit('notice', username + ' has connected.');
            socket.username = username;
            users.push(username);

            update_users();


            //
            // CHAT MESSAGE RECEIVED
            ///////////////////////////
            socket.on('chat_message', function(msg){
                var message = getTime() + ' ' + socket.username + ': ' + msg;

                update_chat_history(message);
            });


            //
            // DISCONNECT
            ///////////////////////////
            socket.on('disconnect', function () {
                io.emit('notice', socket.username + ' has left the channel.');
                console.log(socket.username + ' disconnected');

                update_users();
            });
        } else {
            socket.emit('logged_in', 'unsuccessful');
            socket.emit('notice', 'Login was unsuccessful, please refresh the page and try again.');
        }
    });


    ///////////////////////////////////////////
    //socket.on('error', function (err){
    //    console.error(err.stack);
    //});
    ///////////////////////////////////////////
});

http.listen(port, ip);

console.log('listening on ' + ip + ':' + port);



//
// Functions
///////////////////////////
function getTime() {
    var t = new Date();
    t = '[' + t.getUTCHours() + ' : ' + t.getUTCMinutes() + ']';

    return t;
}

function update_users() {
    //console.log(io.sockets.connected);
    users = [];

    for( var client in io.sockets.connected ){
        var username = io.sockets.connected[client].username;
        if(username){
            users.push(username);
        }
    }

    users = JSON.stringify(users);
    io.emit('users_online', users);
}

function update_chat_history(message_to_add){
    chat_history.push(message_to_add);

    if(chat_history.length > 20){
        chat_history.splice(0, 1);
    }
}

在 socket.on('login') 处,我测试了在刷新页面或断开连接后套接字不是未定义的。
我想这与它没有更新连接并尝试重新连接到相同的连接有关,但我不知道如何或什么。在 stackoverflow 找不到解决方案。感谢您的帮助。

更新:Blaargh 这根本没有任何作用(╯°□°)╯︵┻━┻

还是同样的错误。现在在 server.js:78:11

http://1.1m.yt/kgaZSBfUa.png

删除所有 socket.usernames 并将登录更改为;

socket.on('login', function(username) {
    if( username ) { // TODO what if duplicate username
        socket.emit('logged_in', 'successful');
        socket.emit('chat_history', JSON.stringify(chat_history));
        io.emit('notice', username + ' has connected.');

        add_user(socket.id, username);
        [...]

也改变了 update_users()

function add_user(id, username){
    users.push({
        'id' : id,
        'username' : username
    });

    var json_users = JSON.stringify(users);
    io.emit('users_online', json_users);
}

function remove_user(id){
    for(user in users){
        if(users[user]['id'] == id){
            users.splice(users[user], 1);
            break;
        }
    }
    var json_users = JSON.stringify(users);
    io.emit('users_online', json_users);
}


更新:2

我仍然完全不知道可能是什么问题,但是我设法围绕它写了一些东西,所以它现在可以工作了。

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    每次刷新页面时,您的套接字都会被删除并创建一个新套接字(没有属性用户名,因为它是一个新套接字),因此您需要找到一种方法来保存您的用户名

    对于您的情况,我建议您将用户名放入 cookie 中,并检查页面加载是否存在 cookie“用户名”并且如果存在则更新您的(新)套接字

    更高级的方法: handle browser reload socket io

    希望这会有所帮助!

    编辑

    npm install --save lodash

        var _ = require('lodash')
        var users = [];
    
        io.sockets.on('connection', function (socket) {
            socket.username ="guest"
         socket.on('login', function(username) {
                if( username) {
                    socket.emit('logged_in', 'successful');
                    io.emit('notice', username + ' has connected.');
                    socket.username = username ;
                    // users.push(username);
                add_user(socket.id, username , users);
    
                    //
                    // CHAT MESSAGE RECEIVED
                    ///////////////////////////
                    socket.on('chat_message', function(msg){
                        var message = date.Now() + ' ' + socket.username + ': ' + msg;
    
                    });
    
    
                    //
                    // DISCONNECT
                    ///////////////////////////
                    socket.on('disconnect', function () {
                        io.emit('notice', socket.username + ' has left the channel.');
                        console.log(socket.username + ' disconnected');
    
    
                    });
                } else {
                    socket.emit('logged_in', 'unsuccessful');
                    socket.emit('notice', 'Login was unsuccessful, please refresh the page and try again.');
                }
            });
    
    
    
            socket.emit('message', { message: 'welcome to the chat' });
            socket.on('send', function (data) {
                io.sockets.emit('message', data);
            });
        });
        console.log("Listening on port " + port);
    
    
        function add_user(id, username , users){
    
            var item = {
                'id' : id,
                'username' : username
            }
    
         var oldItem = _.find(users, {id: id});
                  var index = users.indexOf(oldItem);
    
                  if (oldItem) {
                    users.splice(index, 1);
                    users.unshift(item);
                  } else {
                    users.unshift(item);
                  }
    
    
    
    
    
            users = JSON.stringify(users);
                console.log(users)
            io.emit('users_online', users);
        }
    
        function remove_user(id){
            for(user in users){
                if(users[user]['id'] == id){
                    users.splice(users[user], 1);
                    break;
                }
            }
            users = JSON.stringify(users);
            io.emit('users_online', users);
        }
    

    【讨论】:

    • 好吧,我不在乎用户名是否丢失。事实上,我希望用户名丢失。应该有一种方法可以强制更新连接,而不是在丢弃套接字后尝试重新连接。就像以前的连接从未存在过一样。
    • 其实有 var socket = io.connect(URL, {'force new connection': true });。试试这个,而不是替换 socket.username = username || 'guest' 但是这是一个快速修复...
    • 由于某种原因它不起作用:l 我也尝试像这样screen 定义用户名,但它也不起作用,所以问题不可能是它无法访问未定义的(socket.username) ..
    • 删除 if 条件下的 '!socket.username' !在 users.push 之前做一个套接字用户名的控制台日志并检查值
    • 就在 push 之前,socket.username 符合预期,用户名输入。
    猜你喜欢
    • 2012-10-23
    • 2015-08-04
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多