2013-11-30 5 views
0

Я пишу приложение node.js с использованием паспорта для аутентификации. Я заметил странное поведение: Если я использую этот код, мой сервер застревает после 10 запросов (я подрезал из некоторых не соответствующего кода):Сервер Node.js застревает после нескольких запросов при использовании паспорта

var express = require('express'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 
var MySqlBl = require('./server/db/mysqlbl'); 

var app = express();  

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function (user, done) { 
    done(null, user.userName); 
}); 

passport.deserializeUser(function (username, done) { 
    var mysqlbl = new MySqlBl(); 
    mysqlbl.getUser(username, onGetUserCompleted); 

    function onGetUserCompleted(user) { 
     if (user === undefined) { 
      done('Problem deserializing user'); 
     } 

     done(null, user); 
    }; 
}); 

passport.use(new LocalStrategy(function (username, password, done) { 
    var mysqlbl = new MySqlBl(); 
    mysqlbl.getUser(username, onGetUserCompleted); 

    function onGetUserCompleted(user) { 
      return done(null, user); 
     }; 
    } 
)); 

app.use(app.router); 

require('./server/routes')(app); 

Я пытался полностью удалить любой код паспорта связана между собой, и мой сервер работал очень хорошо, но я все еще хочу использовать паспорт lib ... Любая помощь пожалуйста? Я все испробовал, мне нужно какое-то направление.

+2

Я не знаю о модуле MySqlBl, но, похоже, это может быть утечка подключений к базе данных, если вы никогда не закроете после этого. –

+0

Как сказал @JoachimIsaksson, ваш модуль MySqlBl, вероятно, открывает соединения и не закрывает их, что заполняет пул сокетов ['globalAgent'] (http://nodejs.org/api/http.html#http_class_http_agent). Когда пул заполнен, дальнейшие запросы приостановлены, ожидая освобождения сокета. –

+0

переместите соединение db к модулю, чтобы вы могли повторно использовать объект db – tschiela

ответ

2

Спасибо за помощь, нашли неполадку!

Основная причина отсутствия ответа серверов заключается в том, что функция deserializeUser никогда не вызывала done.

Это было связано с тем, что у меня была проблема с утечкой соединений с БД.

+0

, спасибо за ответ на этот вопрос самостоятельно. Помог мне со мной вопрос. – user1933131

Смежные вопросы