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
相关产品推荐
相关产品推荐

