Node.js 基于MongoDB查找重定向Passport登录
我有登录路径Node.js 基于MongoDB查找重定向Passport登录,node.js,mongodb,express,Node.js,Mongodb,Express,我有登录路径router.post('/login',authController.login)。我的控制器使用passport,看起来像: exports.login = passport.authenticate('local', { failureRedirect: '/login', failureFlash: 'Failed Login', successRedirect: '/', successFlash: 'You are now logged in' });
router.post('/login',authController.login)。
我的控制器使用passport,看起来像:
exports.login = passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login',
successRedirect: '/',
successFlash: 'You are now logged in'
});
这很好,但是如果用户没有设备,我想重定向到/store
,如果用户有设备,我想根据查询重定向到/device
:
const devices = await Device.find({ owner: req.user._id });
最好的方法是什么?我试过:
router.post('/login', authController.login, deviceController.hasDevice);
exports.login = (req, res, next) => {
passport.authenticate('local', {
failureRedirect: '/login',
failureFlash: 'Failed Login'
});
next();
};
exports.hasDevice = async (req, res) => {
const devices = await Device.find({ owner: req.user._id });
if (!devices.length) {
res.render('store', { title: 'Store' });
} else {
res.render('devices', { title: 'My Devices', devices });
}
};
但当我到达hasDevice时,req上没有用户对象。例如,我得到“找不到未定义的id”。您可以使用
passport.authenticate()中的自定义回调来实现这一点
我试图做的只是通过使用重定向来解决,如:
router.get('/', someController.findRoute));
exports.findRoute= async (req, res) => {
const devices = await Device.find({ owner: req.user._id });
if (!devices.length) {
res.redirect('/store');
} else {
res.redirect('/devices');
}
};
除了设置之外,这里还有一些缺陷。1.您说要“重定向”,但这些不是重定向,只是在同一/login
URL上呈现不同的内容。2.通常,您无论如何都不会在重定向上“传递数据”,因此实际上应该由/devices
路由和控制器来获取数据。3.hasDevice
查找外来模型的概念是“非常相关的”,并且会对每个请求的数据库造成额外的影响。如果这对应用程序使用模式很重要,最好将deviceCount
添加到User
模型中。
router.get('/', someController.findRoute));
exports.findRoute= async (req, res) => {
const devices = await Device.find({ owner: req.user._id });
if (!devices.length) {
res.redirect('/store');
} else {
res.redirect('/devices');
}
};