如何在控制器中使用护照中间件
how to use passport middleware in a controller
正在尝试设置本地护照。使用此 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 文件中不起作用?
您想要 exports
和 module.exports
之间的外观差异,并在您的控制器中使用 module.exports
而不是 exports
找到这个;
这与 @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);
};
... 现在它很有魅力!
感谢您的帮助。希望这也能帮助到其他人。
正在尝试设置本地护照。使用此 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 文件中不起作用?
您想要 exports
和 module.exports
之间的外观差异,并在您的控制器中使用 module.exports
而不是 exports
找到这个;
这与 @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);
};
... 现在它很有魅力!
感谢您的帮助。希望这也能帮助到其他人。