Nodejs 新手求问:关于 express中类似 checkLogin 方法,应该放在哪个位置比较好?

Nodejs 新手求问:关于 express中类似 checkLogin 方法,应该放在哪个位置比较好?

当前对 routes 分了文件:

index.js
users.js
.
.

在多个 routes 文件中都需要进行 checkLogin, 新手求问这种类似的函数该怎么放置,然后怎么使用比较好?

3 回复

当然可以。在 Express 应用中,处理登录验证逻辑的 checkLogin 函数通常需要在整个应用中复用。因此,将其放置在一个单独的模块中是一个良好的实践。这样不仅可以让代码更加整洁,还能提高可维护性和复用性。

示例代码

  1. 创建 checkLogin 模块

    首先,在你的项目目录中创建一个文件夹(例如 middlewares),并在其中创建一个文件 auth.jscheckLogin.js

    // middlewares/auth.js
    const jwt = require('jsonwebtoken');
    
    module.exports = function checkLogin(req, res, next) {
        try {
            const token = req.headers.authorization.split(' ')[1];
            const decodedToken = jwt.verify(token, process.env.JWT_SECRET);
            req.user = decodedToken;
            next();
        } catch (error) {
            res.status(401).json({ message: 'Authentication failed' });
        }
    };
    
  2. 在路由文件中使用 checkLogin

    然后,在你的路由文件(如 index.jsusers.js)中引入并使用该中间件。

    // routes/users.js
    const express = require('express');
    const router = express.Router();
    const { checkLogin } = require('../middlewares/auth');  // 引入 checkLogin 中间件
    
    // 需要登录验证的路由
    router.get('/profile', checkLogin, (req, res) => {
        res.json({ user: req.user });
    });
    
    // 公共路由
    router.get('/', (req, res) => {
        res.json({ message: 'Welcome to the users section!' });
    });
    
    module.exports = router;
    
  3. 在主应用文件中使用路由

    最后,在你的主应用文件(通常是 app.jsserver.js)中引入并使用路由。

    // app.js
    const express = require('express');
    const app = express();
    const usersRouter = require('./routes/users');
    
    app.use(express.json());
    app.use('/api/users', usersRouter);  // 使用用户路由
    
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    

解释

  • 中间件模块:将 checkLogin 函数放在单独的模块中,便于管理和复用。
  • 路由文件:在需要登录验证的路由中使用 checkLogin 中间件,确保只有通过验证的请求才能访问这些路由。
  • 主应用文件:在主应用文件中引入并注册路由,使得整个应用可以使用这些路由和中间件。

这种方式不仅使代码更加清晰,也方便你在未来扩展或修改验证逻辑。


当然写在一个中间件里啊 这样使用吧 第一个是你的mid.js 第二个在里的路由文件里面

exports.checkLogin = function (req , res , next) {
    //do something
    next()
}
app.post('your url',mid.checkLogin,others.method);

在Express应用中,checkLogin这样的中间件函数通常用于处理用户认证逻辑。为了保持代码的模块化和可维护性,你可以将这类函数单独提取到一个文件中,例如 middleware/auth.js。这样,你可以在不同的路由文件中引用和使用它。

示例代码

1. 创建 auth.js 文件

在项目目录中创建一个名为 middleware/auth.js 的文件,并在其中定义 checkLogin 中间件:

// middleware/auth.js

function checkLogin(req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    res.redirect('/login');
}

module.exports = checkLogin;

这里假设你正在使用 passport 进行用户认证。isAuthenticated() 是 Passport 提供的一个方法,用于检查用户是否已登录。

2. 在路由文件中使用 checkLogin

接下来,在你的路由文件(例如 users.js)中引入并使用这个中间件:

// routes/users.js

const express = require('express');
const checkLogin = require('../middleware/auth');

const router = express.Router();

router.get('/profile', checkLogin, (req, res) => {
    res.send(`Hello ${req.user.username}`);
});

module.exports = router;

在这个例子中,当访问 /profile 路由时,会先执行 checkLogin 中间件。如果用户已登录,则继续处理下一个中间件或路由处理器;否则,重定向到登录页面。

总结

通过这种方式,你可以将认证逻辑集中管理,方便维护和扩展。每个路由文件只需要简单地导入并使用 checkLogin 中间件即可。这种方式使得代码结构更加清晰,提高了代码的复用性和可读性。

回到顶部