2013-07-11 23 views
5

Ben Nodejitsu aşağıdaki hatayı dışarı iplik bulmak uyandı Bu sabahOturum Tanımsız Kullanarak Bağlan-Redis/ExpressJS/Düğüm

Warning: connection.session() MemoryStore is not designed for a production environment, as it will leak memory, and will not scale past a single process.

Kendime düşündüm - ve daha uygun bir şey bulmaya gittim. Redis'e yerleştim ve hemen başvuruma connect-redis ve node-redis'u uygulamaya başladım. Bununla birlikte, aşağıdaki hata bir düzeltmede tekrarlanan denemelerden sonra yüzeye devam eder.

TypeError: Cannot set property 'loggedIn' of undefined 
     at /Users/Ryan/Aggregus/server.js:300:25 
     at Promise.<anonymous> (/Users/Ryan/Aggregus/object_models/user.js:60:5) 
     at Promise.<anonymous> (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:162:8) 
     at Promise.EventEmitter.emit (events.js:95:17) 
     at Promise.emit (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:79:38) 
     at Promise.fulfill (/Users/Ryan/Aggregus/node_modules/mongoose/node_modules/mpromise/lib/promise.js:92:20) 
     at /Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1813:13 
     at model.Document.init (/Users/Ryan/Aggregus/node_modules/mongoose/lib/document.js:243:11) 
     at completeOne (/Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1811:10) 
     at /Users/Ryan/Aggregus/node_modules/mongoose/lib/query.js:1779:11 

loggedIn

basitçe req.session.loggedIn I kullanıcılar giriş yapmış izlemek için kullandığınız bir oturum değişkeni söz ediyor: şöyle hatadır. Aşağıdaki Söz konusu uygulama kodu: Ben express.session çağrı öncesinde app.use(express.cookieParser()); vermiş

  1. :

    var express = require('express'); 
    var crypto = require('crypto'); 
    var mongoose = require('mongoose'); 
    var nodemailer = require('nodemailer'); 
    var request = require('request'); 
    var underscore = require('underscore'); 
    var mandrill = require('node-mandrill')('0bFNPDenlDiZtu7aXujDQQ'); 
    var connect = require('connect'); 
    var engines = require('consolidate'); 
    var fs = require('fs'); 
    var redis = require("redis").createClient(); 
    
    var RedisStore = require('connect-redis')(express); 
    
    var sessionStore = new RedisStore({ 
        client: redis 
    }); 
    
    var stripe_api_key = 'KEY'; 
    var Stripe = require('stripe')(stripe_api_key); 
    
    var app = express(); 
    
    app.configure(function() { 
        app.engine('html', engines.jade); 
        app.set('view engine', 'html'); 
        app.use(express.cookieParser()); 
        app.use(express.bodyParser()); 
        app.use(express.session({secret: "svtabyrki4q786as37c785ta8vi56aiw4i8w467acv", store: sessionStore})); 
        app.use(express.static(__dirname + '/www')); 
        app.use(express.compress()); 
        app.use(app.router); 
    
    }); 
    
    // Mongoose Connection 
    
    var db = mongoose.connection; 
    
    var dbURI = 'HIDDENURL'; 
    
    db.on('disconnected', function() { 
        mongoose.connect(dbURI, {server:{auto_reconnect:true}}); 
    }); 
    
    db.on('error', function(error) { 
        console.error('Error in MongoDb connection: ' + error); 
        mongoose.disconnect(); 
    }); 
    
    mongoose.connect(dbURI, {server:{auto_reconnect:true}}); 
    
    // Mongoose Object Models 
    
    var User = require('./object_models/user')(mongoose, nodemailer, mandrill); 
    var Notifications = require('./object_models/notification')(mongoose, nodemailer); 
    var Experience = require('./object_models/experience')(mongoose, nodemailer); 
    var Booking = require('./object_models/booking')(mongoose, nodemailer); 
    var Review = require('./object_models/review')(mongoose, nodemailer); 
    var Heart = require('./object_models/heart')(mongoose, nodemailer); 
    var Message = require('./object_models/message')(mongoose, nodemailer); 
    
    // Nodemailer Settings 
    
    var smtpTransport = nodemailer.createTransport("SMTP",{ 
        service: "Gmail", 
        auth: { 
         user: "[email protected]", 
         pass: pwd 
        } 
    }); 
    
    // Bootstrap Call 
    
    app.get('/', function(req, res) { 
        res.render('../index.html'); 
        console.log("WUSUP"); 
    }); 
    

    daha da netlik sağlamak için, burada ben boşuna bu noktaya kadar çalıştık budur Bu konunun çoğu makalesinde önerildiği gibi.

  2. new RedisStore numaralı aramamın, başlatmanın hemen ardından client numarasına başvurduğundan emin oldum.
  3. Hem inTTT express.session hem de 'express.cookieParser' çağrılarının her ikisinden sonra app.use(app.router) yerleştirdim.
  4. Redis sunucum, createClient() numaralı çağrı aracılığıyla tamamen işlevseldir.

Bu similar questionapp.router öncesinde sessionStore başlatıldı Express için aranacak bir çok önemsiz app.use başlatma engelleyerek çözüldü.

TL, DR: connect-redis kullanarak oturum değişkenlerim undefined döndürür. Web'i cevaplar için inceledim ve tek ipucum, Express'in kendi oturum işlemlerini gerçekleştirmeden önce app.router'un başlatıldığını gösteriyor. O küçük aksaklıkların olduğu yerde benim dışımda. Yığın Tanrılarından Tanrılar, benim zavallı ruhuma merhamet ederler.

Düzenleme: Bir package.json'ın başvuru için kullanışlı olduğunu düşündüm. NodeJitsu üzerinden oluşturuldu:

{ 
    "name": "Aggregus", 
    "subdomain": "aggregus-Aggregus", 
    "scripts": { 
    "start": "node server.js" 
    }, 
    "version": "0.0.0-14", 
    "engines": { 
    "node": "0.8.x" 
    }, 
    "dependencies": { 
    "connect": "2.7.8", 
    "consolidate": "0.9.1", 
    "express": "3.2.2", 
    "jade": "0.30.0", 
    "mongoose": "3.6.9", 
    "node-mandrill":"1.0.1", 
    "nodemailer": "0.4.1", 
    "request":"2.22.0", 
    "stripe": "1.3.0", 
    "underscore":"1.4.4" 
    } 
} 

cevap

5

Bağlan-redis yanlışını arıyorsunuz ve redis'e ayrıca yüklenmesine gerek yok. Ancak, package.json'unda connect-redis göremiyorum, bu yüzden npm install --save connect-redis'u kullanmalısınız. Sonra böyle bir şey yapın:

var express = require('express'); 
var RedisStore = require('connect-redis')(express); 
var ports = require('./classes/ports.js'); 
var config = require('./config/config.js'); 
var routes = require('./routes'); 
var errors = require('./classes/errors.js'); 

var app = express(); 
ports(app); 
app 
.use(express.logger()) 
.use(express.compress()) 
.use(express.cookieParser()) 
.use(express.session({ 
    store: new RedisStore({ 
    port: config.redisPort, 
    host: config.redisHost, 
    db: config.redisDatabase, 
    pass: config.redisPassword 
    }), 
    secret: 'Your secret here', 
    proxy: true, 
    cookie: { secure: true } 
})) 
.use(express.favicon(__dirname + '/../public/img/favicon.ico')) 
.use(express.bodyParser()) 
.use(express.methodOverride()) 

routes(app); 
errors(app); 
+0

Hey @dankohn Herhangi bir istekte bulunmadan önce derhal req.user öğesini çerezden ayarlamak için nasıl bir işlev ayarlayabilirim? – morgs32

+0

Neredeyse kesinlikle pasaport veya everyauth kullanmak istiyorsun. İşte size bir çerez koyma örneğidir: http://stackoverflow.com/questions/20484649/csrf-token-not-working-when-submitting-form-in-express/20485620#20485620 – dankohn