在express框架,Nodejs router中定义的方法问题

在express框架,Nodejs router中定义的方法问题

核心网络—《Node.js开发指南》MicroBlog项目的问题汇总.png

在routers中定义了登陆和未登录的中间件方法,我想给自身用 就有了 router.get(’/login’, checkNotLogin);
这句

但是会提示 checkNotLogin 请求该什么解决

注: 我需要暴露给app.js用

4 回复

在Express框架中Node.js Router中定义的方法问题

在使用Express框架时,我们常常需要在路由中使用中间件来处理一些通用的操作,例如检查用户是否已登录。当你尝试定义并使用这些中间件方法时,可能会遇到一些问题。让我们通过一个具体的例子来看看如何正确地定义和使用这些中间件。

示例代码

假设你有一个routes.js文件,其中包含了一些路由定义,以及一个中间件函数checkNotLogin。你的目标是确保某些路由只能被未登录的用户访问。

// routes.js
const express = require('express');
const router = express.Router();

// 中间件函数,用于检查用户是否已登录
function checkNotLogin(req, res, next) {
    if (req.session.user) {
        // 如果用户已登录,重定向到首页或其他页面
        res.redirect('/');
    } else {
        // 用户未登录,继续执行下一个中间件或路由处理器
        next();
    }
}

// 使用中间件
router.get('/login', checkNotLogin, (req, res) => {
    res.send('请登录');
});

module.exports = router;

解释

  1. 中间件函数

    • checkNotLogin 是一个自定义的中间件函数,它检查用户的session对象中是否存在user属性。
    • 如果用户已登录(即req.session.user存在),则将用户重定向到首页或其他页面。
    • 如果用户未登录,则调用next()函数,允许请求继续传递到下一个中间件或路由处理器。
  2. 路由定义

    • router.get('/login', ...)中,checkNotLogin作为第一个参数传递。这意味着它会在处理实际的/login路由之前首先被调用。
    • 如果用户未登录,路由处理器res.send('请登录')将被执行。
  3. 暴露给app.js

    • 为了在app.js中使用这个路由,你需要在app.js中引入routes.js文件,并将路由挂载到应用实例上:
// app.js
const express = require('express');
const app = express();
const router = require('./routes');

// 将路由挂载到应用实例上
app.use('/', router);

// 启动服务器
app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

通过这种方式,你可以确保中间件函数checkNotLogin能够正确地应用于特定的路由,并且可以在不同的文件之间复用。


我不知道我想得对不对! 我想说 亲 请按照CommonJs规范来!

楼主的问题正好帮我解惑了,非常感谢。

在Express框架中,你可以通过将中间件方法导出到app.js或其他文件来使用。下面是一个具体的例子,展示如何在路由器中定义和使用中间件方法,并将其暴露给其他文件。

示例代码

1. 定义中间件方法

假设你在middlewares.js文件中定义了两个中间件方法checkLogincheckNotLogin

// middlewares.js

exports.checkLogin = function (req, res, next) {
    if (!req.session.user) {
        req.flash('error', '未登录');
        res.redirect('/login');
        return;
    }
    next();
};

exports.checkNotLogin = function (req, res, next) {
    if (req.session.user) {
        req.flash('error', '已登录');
        res.redirect('/');
        return;
    }
    next();
};

2. 在路由中使用中间件

接下来,在你的路由文件(例如routes.js)中使用这些中间件方法:

// routes.js

const express = require('express');
const router = express.Router();
const { checkLogin, checkNotLogin } = require('./middlewares');

router.get('/login', checkNotLogin, function (req, res) {
    res.render('login');
});

router.get('/', checkLogin, function (req, res) {
    res.render('index');
});

module.exports = router;

3. 在app.js中引入路由

最后,在app.js中引入并使用这个路由:

// app.js

const express = require('express');
const app = express();
const router = require('./routes');

app.use(express.urlencoded({ extended: false }));
app.use(express.json());

app.use('/', router);

app.listen(3000, () => {
    console.log('App is running on http://localhost:3000');
});

解释

  • checkLogincheckNotLogin 是定义在middlewares.js中的中间件方法。
  • routes.js文件中,我们使用require语句导入这些中间件方法,并在路由处理函数前调用它们。
  • 这样可以确保当用户访问特定路由时,先执行中间件逻辑。
  • 最后,将定义好的路由挂载到app.js中,以便在整个应用中使用。

这样你就可以在Express应用的不同部分复用中间件逻辑了。

回到顶部