首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript对象路由映射

Javascript对象路由映射
EN

Stack Overflow用户
提问于 2018-03-09 12:06:00
回答 2查看 544关注 0票数 1

因此,我需要构建一个可以将URL路径映射到目标服务器的对象,如下所示:

代码语言:javascript
复制
/api         :   http://apiserver:8000
/api/v1      :   http://apiv1server:8888
/api/v1/foo  :   http://foo:8080
/foo         :   http://foo:8080

代码语言:javascript
复制
function addRoute(path, server) {
  setRoute(path, server)
}
addRoute('/api', 'http://apiserver:8000')
addRoute('/api/v1', 'http://apiv1server:8888')

每次查找都应该匹配最具体的路由,所以我最初的想法是这样一个对象:

代码语言:javascript
复制
 let map = {
   api: {
     v1: {
       default: 'http://apiv1server:8000',
       foo: 'http://foo:8080'
     },
     default: 'http://apiserver:8000'
   },
   foo: 'http://foo:8080'
 }

这样您就可以使用如下所示的简单查找函数:

代码语言:javascript
复制
function lookup(path) {
  let result = null
  path.split('/').forEach(key => {
    result = map[key] || map[key].default
  })
  return result
}

但是尝试通过点(斜杠)符号设置一个对象已经被证明是非常困难的,有什么想法吗?

或者有其他更简单的方法可以做到这一点?

EN

回答 2

Stack Overflow用户

发布于 2018-03-09 13:09:58

代码语言:javascript
复制
function lookup(path){
   let arr = path.split("/").splice(1);
   let m = {...map};
   arr.forEach((e)=>{
      m = m[e] || m.default;
   })
  return typeof(m) === "object" ? m.default : m;
}

你可以试试这个。

票数 1
EN

Stack Overflow用户

发布于 2018-03-16 05:24:33

谢谢,因为我找不到一个很好的方法来设置路由,所以我使用了下面的递归方法:

代码语言:javascript
复制
let RouteMap = function (def) {
  this.defaultRoute = def
  this.map = {}
}

RouteMap.prototype = {
  lookup: function (path) {
    console.log('ROUTE MAP LOOKUP: ', path)
    if (path) {
      let parts = path.split('/')
      let p = parts.shift()
      if (this.map[p] instanceof RouteMap) {
        return this.map[p].lookup(parts.join('/')) || this.defaultRoute
      } else {
        return this.map[p]
      }
    } else {
      return this.defaultRoute
    }
  },
  set: function (path, val) {
    console.log('ROUTE SET: ', path, val)
    if (path) {
      let parts = path.split('/')
      let p = parts.shift()
      if (parts.length > 0) {
        this.map[p] = this.map[p] || new RouteMap()
        this.map[p].set(parts.join('/'), val)
      } else {
        this.map[p] = val
      }
    } else {
      throw new Error('Path is', path)
    }
  },
  addRoutesFromEnv: function (env) {
    for (let key in process.env) {
      if (key.startsWith('SERVICE_')) {
        let val = process.env[key]
        let parts = val.split('::')
        if (parts.length === 2) {
          this.set(parts[0], parts[1])
          // this.add(parts[0], parts[1]) // /api/v1::http://v1host:8000
        } else {
          console.warn('Invalid SERVICE_NAME environment variable: should be SERVICE_NAME=/path/to/proxy::http://host:port, ', key)
        }
      }
    }

    console.log('ROUTE MAP: ', JSON.stringify(this.map, null, 2))
  }
}

module.exports = RouteMap
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49186453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档