使用node.js和mongodb的简单社交网络

时间:2014-12-01 23:56:19

标签: node.js mongodb backbone.js

我正在尝试构建简单的社交网络,我正在阅读本书(使用MongoDB和Backbone构建节点应用程序)(https://github.com/Swiftam/book-node-mongodb-backbone/tree/master/ch10)。但是,我刚刚意识到node.js版本已经更新。

我解决了一些问题然而我在chat.js中遇到问题,说明这是错误:

CH10 /路线/ chat.js:27  data.sessionStore.load(data.sessionID,function(err,session){ TypeError:无法读取未定义的属性“load”
module.exports = function(app, models) {

var io = require('socket.io');
var utils = require('connect').utils;
var cookie = require('cookie');
    this.io = io;

//var Session = require('connect').middleware.session.Session;

var sio = io.listen(app.server);

sio.configure(function() {

    // Utility methods to see if the account is online
    app.isAccountOnline = function(accountId) {
        var clients = sio.sockets.clients(accountId);
        return (clients.length > 0);
    };

    sio.set('authorization', function(data, accept) {

        var signedCookies = cookie.parse(data.headers.cookie);
    //  var cookies = utils.parseSignedCookies(signedCookies, app.sessionSecret);

    //  data.sessionID = cookies['express.sid'];
        data.sessionStore = app.sessionStore;
        data.sessionStore.load(data.sessionID, function(err, session) {
         if (err || !session) {
          accept("Error", false);
             } else {
           data.session = session;
           accept(null, true);
             }
        });
    });

    sio.sockets.on('connection', function(socket) {
        var session = socket.handshake.session;
        var accountId = session.accountId;
        var sAccount = null;
        socket.join(accountId);
                    io.use(function (socket, next) { next(); });
        // Immediately trigger the login event
        // of this account
        app.triggerEvent('event:' + accountId, {
            from: accountId,
            action: 'login'
        });

        var handleContactEvent = function(eventMessage) {
            socket.emit('contactEvent', eventMessage);
        };

        var subscribeToAccount = function(accountId) {
            var eventName = 'event:' + accountId;
            app.addEventListener(eventName, handleContactEvent);
            console.log('Subscribing to ' + eventName);
        };

        // Find the account contacts and subscribe
        models.Account.findById(accountId, function subscribeToFriendFeed(account) {
            var subscribedAccounts = {};
            sAccount = account;
            account.contacts.forEach(function(contact) {
                if (!subscribedAccounts[contact.accountId]) {
                    subscribeToAccount(contact.accountId);
                    subscribedAccounts[contact.accountId] = true;
                }
            });

            // Subscribed to my feed as well
            if (!subscribedAccounts[accountId]) {
                subscribeToAccount(accountId);
            }
        });

        // Remove listeners if socket disconnects
        socket.on('disconnect', function() {
            sAccount.contacts.forEach(function(contact) {
                var eventName = 'event:' + contact.accountId;
                app.removeEventListener(eventName, handleContactEvent);
                console.log('Unsubscribing from ' + eventName);
            });
            app.triggerEvent('event:' + accountId, {
                from: accountId,
                action: 'logout'
            });
        });
                      var cookieParser = require('cookie-parser')(SESSION_SECRET);    

            // ### Cookie parser

                // Wrapper arround Express cookie parser, so we can use the same cookie parser for socket.io.
                // Parse Cookie header and populate `socket.request.cookies` with an object keyed by the cookie names.
                // Uses signed cookies by passing a secret string, which assigns `socket.request.secret` so it may be used by other middleware.

          function cookieParserWrapper (socket, next) {
            // request, response and callback
          cookieParser(socket.request, {}, next);
            }


        // Handle incoming chats from client
        socket.on('chatclient', function(data) {
            sio.sockets.in(data.to).emit('chatserver', {
                from: accountId,
                text: data.text
            });
        });
    });

});

}

1 个答案:

答案 0 :(得分:0)

不自行测试代码或其他任何内容。

“TypeError:无法读取未定义的属性'load'”

该特定错误意味着data.sessionStore未定义且“load”不作为属性存在,因为data.sessionStore中几乎没有定义。

因此,我认为您的会话系统无法正常运行。希望有所帮助!