JavaScript - objects liefetime

JavaScript - objects liefetime

本文关键字:liefetime objects JavaScript      更新时间:2023-09-26

我正在尝试使用socket.io创建一个node.js服务器。目前只是概念验证。我创建了两个文件,第一个用于服务器,另一个用于服务器端用户。

服务器核心.js

'use strict';
var io = require('socket.io').listen(4567);
var user = require('./server-user');
var users = [];
io.sockets.on('connection', function(socket){
    var su = new user.ServerUser(socket);
    users[socket.id] = su;
    socket.on('auth', su.auth);
    socket.on('disconnect', su.disconnect);
});
io.sockets.on('disconnect', function(socket){
    console.log('disconnect');
   users[socket.id].disconnect();
});
console.log('Server started');

服务器用户.js

var ServerUser = (function(){
    function ServerUser(socket){
        this.socket = socket;
        console.log('serverUser-ctor ' + this.socket)
    }
    ServerUser.prototype.auth = function(data){
        console.log('auth received'r'n' + data);
        this.socket.emit('auth', {
            Id: data.Id,
            Timestamp: data.Timestamp,
            StringField: data.StringField
        });
    }
    ServerUser.prototype.disconnect = function(){
        console.log('Client disconnected');
    }
    return ServerUser;
})();

module.exports = {
    ServerUser: ServerUser
};

我的C#客户端可以很好地连接到服务器,但当用户服务器试图发回答案时,ServerUser.prototype.auth方法中的this.socket是未定义的。这告诉我,我在服务器核心中创建的ServerUser实例没有被保留,当调用"auth"方法时,实际上正在创建对象的新实例。

为了证明这一点,我更换了

socket.on('auth', su.auth);

有这样一个

socket.on('auth', function(data){su.auth(data);});

在此之后,它按需要工作。这是写JS代码的正确方式吗?在编写大型node.js应用程序时,有没有更好的方法将逻辑分离在单独的文件和类下?

谢谢你的意见。

问题在于调用上下文当您将su.auth传递给socket.on()时,this不再引用auth内部的su。因此,有几种方法可以解决这个问题。正如您所发现的,使用匿名函数就是其中之一。Function.bind是另一个:

socket.on('auth', su.auth.bind(su));