【问题标题】:how to use passport middleware in a controller如何在控制器中使用护照中间件
【发布时间】:2018-10-26 03:31:09
【问题描述】:

尝试设置本地护照。用这个guide 作为灵感。

我遇到的问题是,当我从路由文件调用函数到控制器文件时,它不起作用。如果我将控制器文件中的代码放在路由文件中,它就可以工作。

这是我的 app.js

const express       = require('express');
const bodyParser    = require('body-parser');
const passport      = require('passport');
const flash         = require('connect-flash');
const morgan        = require('morgan');
const cookieParser  = require('cookie-parser');
const session       = require('express-session');

const Data = require('./app/models/data.js');
const User = require('./app/models/user.js');

require('./config/passport')(passport)

// create express app
const app = express();

// set the view engine to ejs
app.set('view engine', 'ejs');

// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }))

// parse requests of content-type - application/json
app.use(bodyParser.json())

// Configuring the database
const dbConfig = require('./config/database.js');
const mongoose = require('mongoose');

mongoose.Promise = global.Promise;

// Connecting to the database
mongoose.connect(dbConfig.url)
.then(() => {
    console.log("Successfully connected to the database");    
}).catch(err => {
    console.log('Could not connect to the database. Exiting now...');
    process.exit();
});

// log every request to the console
app.use(morgan(':remote-user :referrer :method :url :status :res[content-length] - :response-time ms :req[header] :res[header]')); 

// read cookies (needed for auth)
app.use(cookieParser()); 

// required for passport
app.use(session({ 
    secret: 'ilovescotchscotchyscotchscotch',
    resave: false,
    saveUninitialized: false 
})); // session secret

app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions

// use connect-flash for flash messages stored in session
app.use(flash()); 


// Define start route <url>'/'
app.get('/', (req, res) => {
    res.render('pages/index');
});



// Require routes
require('./app/routes/routes.data.js')(app);
require('./app/routes/routes.user.js')(app, passport);


// All loaded, start server
// listen for requests
app.listen(3000, () => {
    console.log("Server is listening on port 3000");
});

这是 routes.user.js

module.exports = (app) => {
const user = require('../controllers/controller.user.js');
const passport      = require('passport');

// Visa Logga in-sidan
app.get('/login', user.login)

// Visa registreringssidan
app.get('/signup', user.signup)

// Skapa user
app.post('/signup', user.createUser)

}

这是controller.user.js

const User          = require('../models/user.js');
const passport      = require('passport');

require('../../config/passport')(passport)

exports.login = (req, res) => {
    res.render('pages/login', { message: req.flash('loginMessage') });     
};

exports.signup = (req, res) => {
    res.render('pages/signup', { message: req.flash('signupMessage') });     
};

exports.createUser = (req, res) => {
    passport.authenticate('local-signup', {
        successRedirect : '/all', // redirect to the secure profile section
       failureRedirect : '/signup', // redirect back to the signup page if there is an error
       failureFlash : true // allow flash messages
   });    
};

当我尝试注册用户时,它会超时。没什么,只是超时。

但是如果我将这部分从 controller.user.js 中移出...

passport.authenticate('local-signup', {
        successRedirect : '/all', // redirect to the secure profile section
       failureRedirect : '/signup', // redirect back to the signup page if there is an error
       failureFlash : true // allow flash messages
   });

...到 routes.user.js

    // Skapa user
    app.post('/signup', passport.authenticate('local-signup', {
        successRedirect : '/all', // redirect to the secure profile section
       failureRedirect : '/signup', // redirect back to the signup page if there is an error
       failureFlash : true // allow flash messages
   }));

.. 一切正常。

为什么它在 controller.user.js 文件中不起作用?

【问题讨论】:

  • 请编辑您的“指南”链接。
  • 修复了@BenceUszkai
  • 你试过了吗:(req, res, next) => { passport.authenticate(/*same*/)(req, res, next); } ?
  • @IdanDagan,我试过但没用。你能用sn-p告诉我你的意思吗?
  • @IdanDagan 您的解决方案有效。感谢您的帮助!

标签: node.js mongodb express passport.js passport-local


【解决方案1】:

找到这个; Passport Authenticate doesn't redirect

这与@IdanDagan 发布的解决方案相同。

我在controller.user.js中修改了这个部分

exports.createUser = (req, res, next) => {
    passport.authenticate('local-signup', {
        successRedirect : '/all', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    });
};

到下面

exports.createUser = (req, res, next) => {
    passport.authenticate('local-signup', {
        successRedirect : '/all', // redirect to the secure profile section
        failureRedirect : '/signup', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
    })(req, res, next);
};

...现在它就像一个魅力!

感谢您的帮助。希望这也可以帮助其他人。

【讨论】:

    【解决方案2】:

    您希望看到 exportsmodule.exports 之间的差异,并在控制器中使用 module.exports 而不是 exports

    【讨论】:

    • 导出没有问题
    猜你喜欢
    • 2018-08-07
    • 2018-04-16
    • 2021-04-03
    • 1970-01-01
    • 2017-10-05
    • 2016-05-09
    • 1970-01-01
    • 2015-11-26
    • 2021-06-03
    相关资源
    最近更新 更多