【问题标题】:Passport deserialize calls twice per each requestPassport 每个请求反序列化调用两次
【发布时间】:2013-12-10 06:30:36
【问题描述】:

当我在节点 js + 护照应用程序中打开任何 url 时,我有 2 个数据库请求(可能是反序列化方法调用)。

我的日志:

NEW QUERY____________________
SELECT * FROM users WHERE id=$1
[ '1' ]
GET / 200 248ms - 829b
NEW QUERY____________________
SELECT * FROM users WHERE id=$1
[ '1' ]
GET /stylesheets/style.css 404 3ms

反序列化方法和中间件:

app.configure(function() {
    // all environments
    app.set('port', process.env.PORT || 3000);
    app.set('views', path.join(__dirname, 'views'));
    app.set('view engine', 'jade');
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(express.favicon());
    app.use(express.logger('dev'));
    app.use(express.cookieParser());
    app.use(express.json());
    app.use(express.urlencoded());
    app.use(express.methodOverride());
    app.use(express.session({
        secret: "thisismysecretkey",
        store: new RedisStore({ host: 'localhost', port: 6379, client: redisClient })
    }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});



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

passport.deserializeUser(function(id, done){
    user.get(id, function(err, user){
        done(err, user);
    });
});

看起来像 issue 但它对我不起作用。

我正在使用护照 js 进行身份验证,看起来有点害怕:

exports.authenticate = function (req, res) {
var form = new multiparty.Form();

form.parse(req, function(err, fields) {
    var userEmail = fields.email[0];
    var userPassword = fields.password[0];
    if (err) throw err;
    userProvider.isBlockedEmail(userEmail, function(err, blocked) {
        if (err) throw err;
        if (blocked) {
            res.send({error: true, description: 'you did too much attempts'});
        } else {
            userProvider.authenticate(userEmail,  userPassword, function (err, user) {
                if (err) throw err;
                else if (user === undefined) res.send({error: true, description: 'wrong login or password'});
                else if (user) {
                    req.login(user, function (err) {
                        if (err) throw err;
                        else if (user.banned === true) res.send({error: true, description: 'access denied'});
                        else {
                            userProvider.resetAttemptsCounter(userEmail, function(err) {
                                if (err) throw err;
                                res.send(req.user);
                            });
                        }
                    });
                } else {
                    userProvider.checkAndBlock(userEmail, function(err, isBlocked, descriptions) {
                        if (err) throw err;
                        if (isBlocked) {
                            res.send({error: true, description: descriptions});
                        } else {
                            userProvider.increaseAttemptsCounter(userEmail, function(err) {
                                if (err) throw err;
                                res.send({error: true, description: 'wrong login or password'});
                            });
                        }
                    });
                }
            });
        }
    });
});

};

请帮我避免这种开销。

【问题讨论】:

    标签: node.js express passport.js


    【解决方案1】:

    我认为这是一个类似的问题:

    app.use(passport.initialize());
    app.use(passport.session());
    app.use(express.favicon()); <---- !!
    app.use(app.router);
    

    这意味着每个向/favicon.ico 的请求都会调用 Passport 中间件(这几乎适用于每个页面)。

    您应该对其重新排序,以便在 Passport 中间件之前调用 express.favicon

    app.use(express.favicon());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    

    【讨论】:

    • GET /stylesheets/style.css 404 3ms 好像我在链接 css 但我不是。
    • @SlowHarry 它必须来自某个地方 :)
    • 我链接了它,但是它,但是又有请求(现在一个请求用于任何请求)。
    • @SlowHarry 我认为您无法避免这种情况,Passport 不知道哪些路线需要反序列化,哪些路线不需要。
    • 我只是通过关闭passport.session()来修复它,使用req.session.user而不是使用req.user
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2019-08-14
    • 2018-03-30
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多