2013-05-21 5 views
1

코드에서 문제 stright를 넣으려면 : 은 (연결-MongoDB를 실제로 원인)

expressApp.get('/', function requestHandler(req, res) { 
    userMongooseModel.create(userPropertiesDict, NEVER_CALLED_CALLBACK); 
    console.log('This is printed just fine but browser awaits response forever.'); 
} 

익스프레스 3.x, 몽구스는 3.x입니다. 초기화
Imprtant 세부 정보 :

mongoose.connect(mongourl); 
var mongoStore = require('connect-mongodb'); // Not 'connect-mongo', sic! 
var store = new mongoStore({db: mongoose.connection.db}, resultHandler); 

당신은 GitHub에서 전체 코드를 볼 수 있습니다.
다음은 거기에서 주요 스크립트의 축소 된 버전입니다 :이 문제가 connect-mongodb하지 connect-mongo 포함 가

var express = require('express'), 
    mongoose = require('mongoose') 
    mongoStore = require('connect-mongodb'); 

var app = express(); 
var mongourl = 'mongodb://localhost/problem_users'; 
var port = 9001; 

console.log('Connecting to MongoDB...'); 
mongoose.connect(mongourl); 

Schema = mongoose.Schema; 

attributes = { 
    email: { 
    type: String, 
    required: true, 
    unique: true 
    } 
}; 

schema = new Schema(attributes, { 
    strict: true 
}); 

var User = mongoose.model('User', schema); 

app.configure(function() { 

    app.use(express.cookieParser()); 

    app.use(express.session({ 
    secret: 'What bad can happen if I share this secret?', 
    maxAge: new Date(Date.now() + 60*60*1000), 
    store: new mongoStore({ 
     db: mongoose.connection.db 
    }, function(err) { 
     return console.log(err || 'connect-mongodb setup ok'); 
    }) 
    })); 

    return app; 
}); 

app.get('/', function(req, res) { 
    console.log('Ready to register a new user...'); 

    var userPropertiesDict = { 
    email: '[email protected]', 
    } 

    console.log('Calling User.create...'); 
    User.create(userPropertiesDict, function(err, doc) { 

    console.log('WHY IS THIS MESSAGE NOT PRINTED AT ALL?'); 
    var done = process.stdout.write('Are we stuck at flushing?'); 
    if (!done) { // Is stdout blocked? 
     process.stdout.on('drain', _) 
    } 

    }); 
    console.log('RESPONSE IS OVER. THIS MESSAGE IS PRINTED AT THE END AND WE HANG AFTERWARDS.'); 
}); 

app.listen(port); 
console.log("Listening on port ", port); 
console.log("MongoDB url ", mongourl); 
console.log('Navigate your browser to http://localhost:%d', port); 

답변

1

참고. connect-mongodb에서 connect-mongo으로 전환하면 문제를보다 세련되게 해결할 수 있으므로 먼저 시도해야합니다. 다음은 connect-mongodb과 관련이 있습니다.

나는 문제가 express을 포함하지 않는다는 것을 알아 냈습니다. 실제로 mongoose 연결과 세션이 초기화되는 순서를 처리합니다.

세션이 초기화되면 데이터베이스가 이미 연결되어 있어야합니다. mongoose.connect은 비동기 적으로 실행되므로 세션이 초기화 될 때 문제가 발생하기 쉽습니다 (이전처럼).

슬픈 측면은 어떤 이유로 든 connect-mongodb이 오류를 던지거나 전달하지 않는다는 것입니다.

mongooseconnect-mongodb 초기화의 올바른 방법과 잘못된 방법은 아래 코드에서 확인할 수 있습니다.

var mongoose = require('mongoose') 
    mongoStore = require('connect-mongodb'); 

var mongourl = 'mongodb://localhost/problem_users'; 

console.log("MongoDB: url ", mongourl); 
console.log('MongoDB: connecting...'); 

/* 
// THE WRONG WAY OF USING mongoose WITH connect-mongodb. 
// The source below was the source of the problem. 

mongoose.connect(mongourl, function(err) { 
    console.log('THIS IS NOT PRINTED.'); 
    if (err) { 
    console.log('THIS IS NOT PRINTED EITHER.'); 
    throw err; 
    } 
}); 

new mongoStore({ 
    db: mongoose.connection.db 
}, function(err) { 
    // The line below usually prints 2. 
    console.log('MongoDB: readyState %d (2 = connecting, 1 = connected)', mongoose.connection.readyState); 
    return console.log(err || 'connect-mongodb setup ok'); 
}) 
*/ 

// THE RIGHT WAY OF USING mongoose WITH connect-mongodb. 
mongoose.connect(mongourl, {auto_reconnect: true, native_parser: true}, function(err) { 
    new mongoStore({ 
    db: mongoose.connection.db 
    }, function(err) { 
    // The line below usuall prints 1. 
    console.log('MongoDB: readyState %d (2 = connecting, 1 = connected)', mongoose.connection.readyState); 
    return console.log(err || 'connect-mongodb setup ok'); 
    }); 
}); 

console.log('MongoDB: connected.') 

Schema = mongoose.Schema; 

attributes = { 
    email: { 
    type: String, 
    required: true, 
    unique: true 
    } 
}; 

var schema = new Schema(attributes); 

var User = mongoose.model('User', schema); 

function createUser(callback) { 

    var userPropertiesDict = { 
    email: '[email protected]', 
    } 

    console.log('Calling User.create...'); 
    User.create(userPropertiesDict, callback); 
} 

function NEVER_CALLED_CALLBACK(err, doc) { 

    console.log('WHY IS THIS MESSAGE NOT PRINTED AT ALL?'); 
    var done = process.stdout.write('Are we stuck at flushing?'); 
    if (!done) { // Is stdout blocked? 
     process.stdout.on('drain', _) 
    } 
} 

createUser(NEVER_CALLED_CALLBACK); // This either creates new User or logs an error that it already exists. 

또한 나에게 일을 올바른 방법을 해결하는 데 도움이 this article 참조하십시오.

관련 문제