1、定义模块的路由

对象中的key为url,value为action+controller+method

module.exports = {'/opportunities/:opportunityId/discussionPosts': {get: {controller: 'DiscussionPostsController',method: 'getDiscussionPosts',auth: 'jwt'},post: {controller: 'DiscussionPostsController',method: 'createDiscussionPost',auth: 'jwt'}},'/discussionPosts/:discussionPostId/replies': {get: {controller: 'DiscussionPostsController',method: 'getDiscussionPostReplies',auth: 'jwt'},post: {controller: 'DiscussionPostsController',method: 'createDiscussionPostReply',auth: 'jwt'}}
}

2、统计管理注册路由

遍历文件 ,各个模块路由注册到modules中

const fs = require('fs')
const path = require('path')const modules = {}fs.readdirSync(__dirname).filter(file => (file.indexOf('.') !== 0) && (file !== path.basename(module.filename)) && (file.slice(-3) === '.js')).forEach((file) => {const moduleName = file.slice(0, -3)modules[moduleName] = require(path.join(__dirname, file))})module.exports = Object.assign({}, ...Object.values(modules))

3、注册到express路由

遍历路由,根据路由参数,添加中间拦截器

module.exports = (app) => {// Load all routes_.each(routes, (verbs, path) => {_.each(verbs, (def, verb) => {const controllerPath = `./src/controllers/${def.controller}`const method = require(controllerPath)[def.method]; // eslint-disable-lineif (!method) {throw new Error(`${def.method} is undefined`)}const actions = []actions.push((req, res, next) => {req.signature = `${def.controller}#${def.method}`next()})// add Authenticator check if route has authif (def.auth) {actions.push(async (req, res, next) => {let tokenif (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') {token = req.headers.authorization.split(' ')[1]}if (token) {// decode the user id from the tokentry {const decoded = jwtDecode(token)if (!decoded.sub) {res.status(401).json({ message: 'The token provided is invalid.' })res.send()} else {const user = await models.User.findByOktaName(decoded.sub)req.authUser = user.id}} catch (error) {res.status(401).json({ message: 'The token provided is invalid.' })res.send()}} else {// if there is no token// return an errorres.status(401).json({ message: 'No token provided.' })res.send()}next()})}actions.push(method)const fullPath = config.get('BASE_PATH') + pathapp[verb](fullPath, helper.autoWrapExpress(actions))})})// Check if the route is not found or HTTP method is not supportedapp.use('*', (req, res) => {let url = req.baseUrlif (url.indexOf(config.get('BASE_PATH')) === 0) {url = url.substring(config.get('BASE_PATH').length)}const route = routes[url]if (route) {res.status(HttpStatus.METHOD_NOT_ALLOWED).json({ message: 'The requested HTTP method is not supported.' })} else {res.status(HttpStatus.NOT_FOUND).json({ message: 'The requested resource cannot be found.' })}})
}

路由在express中的实践相关推荐

  1. Node.js—Express、Express 路由 、Express 中间件、使用 Express 写接口

    目标: 能够使用 express.static() 快速托管静态资源 能够使用 express 路由精简项目结构 能够使用常见的 express 中间件 能够使用 express 创建API接口 能够 ...

  2. Node 学习 | Day03 express (初识Express、Express 路由、Express 中间件、使用 Express 写接口)

    Express 初识Express 1.1 Express 简介 1.1.1 什么是 express 1.1.2 进一步理解 Express 1.1.3 Express可以做什么 1.2 Expres ...

  3. 初识express(简介,安装和基本使用),路由(express处理路由)

    目录 express的简介 express的安装和基本使用(不能全局安装) express的简单使用 express生成的服务器对象 req和res 工具的使用 nodemon rest client ...

  4. 示例Express中路由规则及获取请求参数

    本次给大家分享一篇基于express中路由规则及获取请求参数的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. express中常见的路由规则 ...

  5. 【node】express中mysql的基本用法、连接池的使用、事务的回滚

    [node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...

  6. Bilibili资深运维工程师:DCDN在游戏应用加速中的实践

    简介:bilibili资深运维工程师李宁分享<DCDN在游戏应用加速中的实践>从bilibili游戏应用的效果和成本入手,深入浅出地分享DCDN全站加速在游戏加速场景中的应用. 日前,云栖 ...

  7. 使用 Node.js Express 的最佳实践

    Production best practices: performance and reliability 本文讨论部署到生产的 Express 应用程序的性能和可靠性最佳实践. 这个话题显然属于& ...

  8. Service Mesh 高可用在企业级生产中的实践

    Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播.本期为 Service Mesh Virtual Meetup#1 , ...

  9. 对比原生Node封装的Express路由 和 express框架路由

    文章目录 前言 一.routes.js 1.引入模块 2.changesRes() - send() 3.getFileMime() - type() 4.initStatic 5.server() ...

最新文章

  1. 课后习题代码持续更新。。。。。。。。。。。。。
  2. 优化javaScript代码,提高执行效率
  3. id和class到底要用哪一个?
  4. 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
  5. YouTube测试购物功能、 2021 最值得效力的科技公司榜单、2020 移动应用年度报告等|Decode the Week...
  6. LeetCode 166. 分数到小数(小数除法)
  7. 【Scala】Scala中的_ 和 _*分别代表什么
  8. mybatis加载xml配置文件
  9. 表格识别----基于模板的文字识别结果结构化处理技术
  10. html设置table高度自适应高度,css display table 自适应高度、宽度问题的解决
  11. python考勤系统_使用Djang的考勤系统
  12. Android热修复Sophix的使用
  13. java 发卡器_充值发卡器
  14. SuperMap iClient3D for WebGL之BIM模型爆炸
  15. copyproperties爆红_一屋模玩怎样不能价值300万?分分钟用超.......
  16. 暴躁兔melody避坑记
  17. Spring Security系列教程16--基于持久化令牌方案实现自动登录
  18. 北京化工大学计算机考研资料汇总
  19. 画论25 黄休复《益州名画录》
  20. C#中实现两个程序的通信

热门文章

  1. C#基础总结之四List-Hashtable-冒泡排序
  2. Linux下rz,sz与ssh的配合使用,实现文件传输
  3. URAL 1993 This cheeseburger you don't need
  4. html盒子高度自动收缩,CSS如何解决背景图随父盒子高度变化而拉伸或收缩的问题...
  5. python编程从入门到实践看完了看什么-小白Python编程从入门到实践——列表是什么...
  6. 用python画烟花-python 实现漂亮的烟花,樱花,玫瑰花
  7. python学起来难不难-自学Python很难吗,为何会看不进去!
  8. python3入门到精通pdf-总算知道python3入门到精通
  9. python能做软件开发吗-学习Python软件开发能做什么?
  10. python常用内置模块-python 常用内置模块使用