Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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 基于MongoDB查找重定向Passport登录_Node.js_Mongodb_Express - Fatal编程技术网

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');
  }
};