7

今朝目覚めると、Nodejitsu で次のエラーが表示されていました。

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

'じゃあ!' 私は自分自身に考えました-そして、私はもっと適切なものを見つけに行きました。Redis に落ち着き、すぐにアプリケーションへの実装connect-redisを開始しました。node-redis

ただし、修正を繰り返し試みた後も、次のエラーが引き続き発生します。エラーは次のとおりです。

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

loggedInreq.session.loggedInログインしたユーザーを追跡するために使用するセッション変数を単に参照しています。問題のアプリケーション コードは次のとおりです。

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: "ryan@aggregus.com",
        pass: pwd
    }
});

// Bootstrap Call

app.get('/', function(req, res) {
    res.render('../index.html');
    console.log("WUSUP");
});

さらに明確にするために、これまで私が試したことが役に立たなかったものを次に示します。

  1. この主題のほとんどの記事が示唆したように、私は電話app.use(express.cookieParser());の前に配置しました.express.session
  2. 初期化時にnew RedisStore呼び出しがclientを直接参照するようにしました。
  3. app.use(app.router)両方の init 呼び出しexpress.sessionと「express.cookieParser」の両方の後に配置しました。
  4. 私のRedisサーバーは、createClient()呼び出しを介して完全に機能しています。

この同様の問題は、Express の sessionStore が初期化される前にapp.use呼び出されるかなり重要でない初期化を防止することで解決されました。app.router

したがって、TL;DR: を使用するconnect-redisと、セッション変数は を返しundefinedます。私は答えを求めて Web を精査しましたが、唯一の手がかりは、それapp.routerが Express 自身のセッション処理の前に開始されたことです。その小さなグリッチがどこで発生するかは、私を超えています。スタック オーバーフローの神々は、私の哀れな魂を憐れんでくれます。

編集: package.json が参考になると思います。NodeJitsu 経由で生成:

{
  "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"
  }
}
4

1 に答える 1