You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js分层架构下JWT认证函数在控制器中的使用疑问

解决方法:在拆分后的Node.js项目中使用JWT认证中间件

咱们先理清楚核心逻辑:Express的中间件(比如你的authenticate)是挂载在路由层的,不需要直接在控制器方法内部调用。我会一步步帮你把各个文件配置到位,让认证逻辑和控制器、路由完美配合。

1. 先处理authenticate.js的导出

把原认证函数移到authenticate.js,并修复一个关键遗漏点(原代码没调用next(),会导致请求挂起):

// authenticate.js
const User = require('./UserModel'); // 根据你的实际目录结构调整路径

const authenticate = (req, res, next) => {
  const token = req.header('x-auth');
  User.findByToken(token)
    .then((user) => {
      if (!user) {
        return Promise.reject();
      }
      req.user = user;
      req.token = token;
      next(); // 认证通过后必须调用next(),让请求继续走到控制器
    })
    .catch((e) => {
      res.status(401).send();
    });
};

module.exports = authenticate;

2. 配置UserController.js的get_user方法

控制器只需要专注业务逻辑——因为authenticate中间件已经完成了认证,并把用户信息赋值给了req.user,直接使用即可:

// UserController.js
exports.get_user = (req, res) => {
  // 中间件已经验证通过,req.user就是当前认证的用户
  res.send(req.user);
};

3. 在UserRoute.js中关联中间件与路由

这是核心步骤:把authenticate作为中间件挂载到对应路由上,让请求先经过认证,再进入控制器处理:

// UserRoute.js
const express = require('express');
const router = express.Router();
const authenticate = require('./authenticate'); // 调整路径到你的authenticate.js
const userController = require('./UserController');

// 顺序很重要:先执行authenticate中间件,再执行控制器方法
router.get('/me', authenticate, userController.get_user);

module.exports = router;

4. 在主入口文件(如server.js)注册路由

最后把用户路由挂载到你的Express应用上:

// server.js
const express = require('express');
const app = express();
const userRoutes = require('./path/to/UserRoute'); // 根据实际路径调整

// 把用户路由挂载到/users路径下
app.use('/users', userRoutes);

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

为什么要这么拆分?

这种结构遵循了关注点分离原则:

  • authenticate.js:只负责认证逻辑
  • UserRoute.js:只负责定义路由规则和挂载中间件
  • UserController.js:只负责处理业务逻辑和响应请求
  • UserModel.js:只负责数据模型与数据库交互

拆分后代码更清晰,后期维护、扩展也会轻松很多。

内容的提问来源于stack exchange,提问作者Rolando Azevedo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:26:07