无法读取未定义的属性`xxx`

时间:2015-07-28 04:13:17

标签: javascript node.js undefined

我正在尝试使用NodeJS尝试创建一个基本的Socket.IO服务器以获得它的乐趣,并且我遇到了一个令我困惑的问题。

这是我的服务器代码。相当短,只有一个事件。

// Create the server and start listening for connections.
var s_ = require('socket.io')(5055);
var Session = require('./Session');

var connections = [];

var dummyID = 0;

// Whenever a connection is received.
s_.on('connection', function(channel) {
    connections[channel] = new Session(channel, ++dummyID);;
    console.log("Client connected with the ID of " + dummyID);

    // Register the disconnect event to the server. 
    channel.on('disconnect', function() {
        delete connections[channel];
        console.log("A Client has disconnected.");
    });

    channel.on('login', function(data) {
        if(data.username !== undefined && data.password !== undefined) {
            var session = connections[channel];
            if(session !== undefined) {
                session.prototype.authenticate(data.username, data.password);
            }
        }
    });

});

此行引发错误:

session.prototype.authenticate(data.username, data.password);

说"认证"无法在undefined上调用,这意味着会话原型未定义。根据上面的检查,会话本身并不是未定义的。这是Session.js

var Session = function(channel, dummyID) {
    this.channel = channel;
    this.dummyID = dummyID;
};

Session.prototype = {
    authenticate: function(username, password) {
        if(username == "admin" && password == "admin") {
            this.channel.emit('login', {valid: true});
        } else {
            this.channel.emit('login', {valid: false});
        }
    }
};

module.exports = Session;

正如你可以看到原型显然在那里,我导出了Session对象,我真的很困惑这个问题是什么。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

只需调用您添加到对象原型的函数

session.authenticate(data.username, data.password);

答案 1 :(得分:0)

This article非常清楚地解释了原型继承链,尤其是图表。

另外还有一个提示:javascript中的所有对象在继承链中都有一个__proto__属性,请记住这一点有很大帮助。