如何在 Node.Js、Express、Handlebars、Sequelize 中调用带中间件和不带中间件的不同路由?

问题描述 投票:0回答:1

我有两条路线。 其一是

router.get('/',(req,res)=>{

  res.render('home/index')
})

另外一个是

router.get('/', checklogin, (req,res)=>{

  res.render('home/index',{
  email: req.email,
  name: req.username,
  role: req.role
})
})

这是我的 checklogin 中间件

const checklogin = (req, res, next) =>{
const token = req.cookies.ntoken;
  try{
  const decoded = jwt.verify(token, process.env.JWT_SECRET);
     const {username, email, role} = decoded;
     req.username = username;
     req.email = email;
     req.role = role;
     next();
  }
  catch (err){
    console.log(err);
    next("Invalid Token")
    next()
  }

}

module.exports = checklogin;

我想在登录后重定向到 router.get('/', checklogin, (req,res)=>{}) 路由。并在车把页面上显示登录用户的名称。我有 2 种用户类型;管理员和用户。用户可以登录并进行一些增删改查操作,管理员也会做同样的事情。 我尝试在登录后重定向到 router.get('/', checklogin, (req,res)=>{}) 路由。

我尝试在登录后重定向到 router.get('/', checklogin, (req,res)=>{}) 路由。

这是我的登录路线

 router.post('/login', (req, res) => {


    if (!req.body.email || !req.body.password) {
      res.render('auth/login',{
        error_msg: 'Please Give Email And Password',
        layout: false
    })
    }
    else {
      User.findOne({ where: { email: req.body.email } })
        .then(user => {
          if (!user) {
            res.render('auth/login',{
                error_msg: 'This Email Is Not Registered',
                layout: false
            })
          } else {
  
                    bcrypt.compare(req.body.password, user.password, (err, isMatch) => {
                    if (err) throw err;
                    if (isMatch) {
                        const token = jwt.sign({
                            username: user.name,
                            email: user.email,
                            role: user.role
                        }, process.env.JWT_SECRET,{
                            expiresIn: '1h'
                        });
                       
                        res.cookie('ntoken', token,{
                            httpOnly:true
                        })
                        res.redirect('/');
                      

                    }
                    else {
                        res.render('auth/login',{
                            error_msg: 'Invalid Password',
                            layout: false
                        })
                    }

                });
            }

        }).catch(err => console.log(err));
  
    }
  
  })

我还有其他路线 在admin.js中

router.get("/dashboard", checklogin, async (req, res) => {})
在 user.js 中
router.get("/dashboard", checlogin, async (req, res) => {})

在app.js文件中

const home = require('./routes/home/home');
const admin = require('./routes/admin/admin');
const user = require('./routes/user/user');
app.use('/user', user);
app.use('/', home);
app.use('/admin', admin);

我试过这个。但我在车把页面没有得到我想要的输出..

请帮帮我...

node.js express sequelize.js handlebars.js
1个回答
0
投票

您可以制作一个不同的中间件来解析仅设置

req
用户属性并始终继续路由的令牌。

const parselogin = (req, res, next) => {
    try {
        const decoded = jwt.verify(req.cookies.ntoken, process.env.JWT_SECRET);
        const { username, email, role } = decoded;
        req.username = username;
        req.email = email;
        req.role = role;
    } finally {
        next();
    }
}

然后,对于已登录和未登录的情况,您都可以仅使用这一路由:

router.get('/', parselogin, (req, res) => {
    res.render('home/index', {
        email: req.email,
        name: req.username,
        role: req.role
    });
});

在未登录的情况下,

req.email
req.username
req.role
将是
undefined
,所以只要您的模板处理得很好,它就应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.