路由在express中的实践
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中的实践相关推荐
- Node.js—Express、Express 路由 、Express 中间件、使用 Express 写接口
目标: 能够使用 express.static() 快速托管静态资源 能够使用 express 路由精简项目结构 能够使用常见的 express 中间件 能够使用 express 创建API接口 能够 ...
- 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 ...
- 初识express(简介,安装和基本使用),路由(express处理路由)
目录 express的简介 express的安装和基本使用(不能全局安装) express的简单使用 express生成的服务器对象 req和res 工具的使用 nodemon rest client ...
- 示例Express中路由规则及获取请求参数
本次给大家分享一篇基于express中路由规则及获取请求参数的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下.如有不足之处,欢迎批评指正. express中常见的路由规则 ...
- 【node】express中mysql的基本用法、连接池的使用、事务的回滚
[node]express中mysql的基本用法.连接池的使用 安装mysql包 mysql的配置信息 mysql基本操作 查询mysql并渲染数据 mysql插入操作 首先在html页面写上< ...
- Bilibili资深运维工程师:DCDN在游戏应用加速中的实践
简介:bilibili资深运维工程师李宁分享<DCDN在游戏应用加速中的实践>从bilibili游戏应用的效果和成本入手,深入浅出地分享DCDN全站加速在游戏加速场景中的应用. 日前,云栖 ...
- 使用 Node.js Express 的最佳实践
Production best practices: performance and reliability 本文讨论部署到生产的 Express 应用程序的性能和可靠性最佳实践. 这个话题显然属于& ...
- Service Mesh 高可用在企业级生产中的实践
Service Mesh Virtual Meetup 是 ServiceMesher 社区和 CNCF 联合主办的线上系列直播.本期为 Service Mesh Virtual Meetup#1 , ...
- 对比原生Node封装的Express路由 和 express框架路由
文章目录 前言 一.routes.js 1.引入模块 2.changesRes() - send() 3.getFileMime() - type() 4.initStatic 5.server() ...
最新文章
- 课后习题代码持续更新。。。。。。。。。。。。。
- 优化javaScript代码,提高执行效率
- id和class到底要用哪一个?
- 洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
- YouTube测试购物功能、 2021 最值得效力的科技公司榜单、2020 移动应用年度报告等|Decode the Week...
- LeetCode 166. 分数到小数(小数除法)
- 【Scala】Scala中的_ 和 _*分别代表什么
- mybatis加载xml配置文件
- 表格识别----基于模板的文字识别结果结构化处理技术
- html设置table高度自适应高度,css display table 自适应高度、宽度问题的解决
- python考勤系统_使用Djang的考勤系统
- Android热修复Sophix的使用
- java 发卡器_充值发卡器
- SuperMap iClient3D for WebGL之BIM模型爆炸
- copyproperties爆红_一屋模玩怎样不能价值300万?分分钟用超.......
- 暴躁兔melody避坑记
- Spring Security系列教程16--基于持久化令牌方案实现自动登录
- 北京化工大学计算机考研资料汇总
- 画论25 黄休复《益州名画录》
- C#中实现两个程序的通信
热门文章
- C#基础总结之四List-Hashtable-冒泡排序
- Linux下rz,sz与ssh的配合使用,实现文件传输
- URAL 1993 This cheeseburger you don't need
- html盒子高度自动收缩,CSS如何解决背景图随父盒子高度变化而拉伸或收缩的问题...
- python编程从入门到实践看完了看什么-小白Python编程从入门到实践——列表是什么...
- 用python画烟花-python 实现漂亮的烟花,樱花,玫瑰花
- python学起来难不难-自学Python很难吗,为何会看不进去!
- python3入门到精通pdf-总算知道python3入门到精通
- python能做软件开发吗-学习Python软件开发能做什么?
- python常用内置模块-python 常用内置模块使用