Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 设置用于passport的connect flash中间件_Node.js_Express_Passport.js - Fatal编程技术网

Node.js 设置用于passport的connect flash中间件

Node.js 设置用于passport的connect flash中间件,node.js,express,passport.js,Node.js,Express,Passport.js,我想访问passport策略在其回调中指定的消息,如下所示:done(null,false,{message:'没有这样的用户'})。到目前为止,我发现可以通过将选项failureFlash:true传递到passport.authenticate()函数中来显示这些消息,使用该函数还需要安装connectflash中间件。因此,我安装了模块并添加了var flash=require('connect-flash')到我的源代码,以及app.use(flash())到my express应用程序

我想访问passport策略在其回调中指定的消息,如下所示:
done(null,false,{message:'没有这样的用户'})。到目前为止,我发现可以通过将选项
failureFlash:true
传递到
passport.authenticate()
函数中来显示这些消息,使用该函数还需要安装
connectflash
中间件。因此,我安装了模块并添加了
var flash=require('connect-flash')到我的源代码,以及
app.use(flash())到my express应用程序的配置方法。但是它仍然会因为方法
.flash()
不可用而崩溃。我错过了什么

更多代码:

var http = require('http');
var express = require('express');
var passport = require('passport');
var googleStrategy = require('passport-google').Strategy;
var flash = require('connect-flash');

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

passport.deserializeUser(function (obj, done) {
    done(null, obj);
});

passport.use(new googleStrategy(
    { 
        returnURL: 'http://localhost:123456/auth/google/return', 
        realm: 'http://localhost:123456/' 
    },
    function(identifier, profile, done) {
        process.nextTick(function () {
            User.findOne({ ID: identifier }, function (err, user) {
                if (err) {
                    return done(err);
                }

                if (!user) {
                    return done(null, false, { message: 'no such user' });
                }

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

var app = express();

app.configure(function() {
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ secret: 'veryverysecretsecret' }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(flash());
});

app.get(
    '/auth/google',
    passport.authenticate('google', { failureRedirect: '/login', failureFlash: true }),
    function (req, res) {
        res.redirect('/');
    }
);

app.get('/auth/google/return',
    passport.authenticate('google', { failureRedirect: '/login', failureFlash: true }),
    function (req, res) {
        res.redirect('/');
    }
);

http.createServer(app).listen(123456);

Passport需要在其自身之前配置flash

要解决您的问题,只需更改
app.configure()
中的顺序,然后将passport use移到下面,如下所示:

app.configure(function() {
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ secret: 'veryverysecretsecret' }));
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

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

passport.deserializeUser(function (obj, done) {
    done(null, obj);
});

passport.use(new googleStrategy(
    { 
        returnURL: 'http://localhost:123456/auth/google/return', 
        realm: 'http://localhost:123456/' 
    },
    function(identifier, profile, done) {
        process.nextTick(function () {
            User.findOne({ ID: identifier }, function (err, user) {
                if (err) {
                    return done(err);
                }

                if (!user) {
                    return done(null, false, { message: 'no such user' });
                }

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

很高兴它有帮助

你在哪里使用
.flash()
?我没有。也就是说,不是很明确。据我所知,当重定向到故障路径时,它将被passport调用。。。你能发布更多的消息来源吗?嗯,我想我能。让我来挑出相关的部分。@JasonNichols正在移动应用程序。使用(flash())确实有效,谢谢!把它作为一个答案,好吗?