【问题标题】:Parsing parameters to express endpoint解析参数以表达端点
【发布时间】:2018-06-05 14:39:37
【问题描述】:

我有几个正在运行的快速端点正在查询数据库。我正在尝试像这样解析我的 express-gateway 中的参数:

paths: ['/users', '/users/:userId']

用户端点在 localhost 上运行,/users 确实按预期返回所有用户。问题是/users/:userId 也返回所有用户 - 它应该只返回一个。

当我尝试在没有网关的情况下调用端点时,它工作正常 (http://localhost:3000/users/F692D717-F304-4D9B-A302-44F143923A93/)

但它不能通过网关工作。似乎它永远不会到达最后一个端点或不解析参数。

我的gateway.config.yml

http:
  port: 8080
admin:
  port: 9876
  hostname: localhost
apiEndpoints:
  users:
    host: "*"
    paths: ['/users', '/users/:userId']
  accounts:
    host: "*"
    paths: '/accounts'
  companies:
    host: "*"
    paths: '/companies'
serviceEndpoints:
  users:
    url: 'http://localhost:3000/users'
  accounts:
    url: 'http://localhost:3002/accounts'
  companies:
    url: 'http://localhost:3001/companies'
policies:
  - basic-auth
  - cors
  - expression
  - key-auth
  - log
  - oauth2
  - proxy
  - rate-limit
pipelines:
  users:
    apiEndpoints:
      - users
    policies:
      - proxy:
          - action:
              serviceEndpoint: users 
              changeOrigin: false
              ignorePath: true
  accounts:
    apiEndpoints:
      - accounts
    policies:
      - proxy:
          - action:
              serviceEndpoint: accounts 
              changeOrigin: false
              ignorePath: true
  companies:
    apiEndpoints:
      - companies
    policies:
      - proxy:
          - action:
              serviceEndpoint: companies 
              changeOrigin: false
              ignorePath: true

【问题讨论】:

  • 我在我的应用程序中使用 express,并且我做了与你类似的事情。我为此使用了正则表达式的方式,并且只使用了一个带有此参数“/db/user/(:newUser)?”的路由。你能试试吗?

标签: node.js express express-gateway


【解决方案1】:

找到了解决办法。在给定端点的代理策略操作下,我需要设置prependPath:false。我似乎无法在文档中找到原因。

最终gateway.config.yml:

 http:
  port: 8080
admin:
  port: 9876
  hostname: localhost
apiEndpoints:
  users:
    host: "*"
    paths: ['/users', '/users/:userId']
  accounts:
    host: "*"
    paths: '/accounts'
  companies:
    host: "*"
    paths: '/companies'
serviceEndpoints:
  users:
    url: 'http://localhost:3000/users'
  accounts:
    url: 'http://localhost:3002/accounts'
  companies:
    url: 'http://localhost:3001/companies'
policies:
  - basic-auth
  - cors
  - expression
  - key-auth
  - log
  - oauth2
  - proxy
  - rate-limit
pipelines:
  users:
    apiEndpoints:
      - users
    policies:
      - proxy:
          - action:
              serviceEndpoint: users 
              changeOrigin: false
              prependPath: false
  accounts:
    apiEndpoints:
      - accounts
    policies:
      - proxy:
          - action:
              serviceEndpoint: accounts 
              changeOrigin: false
              prependPath: false
  companies:
    apiEndpoints:
      - companies
    policies:
      - proxy:
          - action:
              serviceEndpoint: companies 
              changeOrigin: false
              prependPath: false

【讨论】:

  • prependPath 默认为 true。这意味着服务端点 URL 路径将作为传入请求路径的前缀。当prependPath 等于true 时,对/users/12345 的传入API 端点请求(服务端点为http://localhost:3000/users)将代理到http://localhost:3000/users/users/12345。将 prependPath 设置为 false 会完全忽略服务端点路径。或者,您可以删除 prependPath: false 声明并从服务端点中删除路径。这应该可以正常工作。
【解决方案2】:

您是否尝试将ignorePath 设置为false?这应该可以解决问题,或者,只需从文件中删除该选项,因为它的默认值为false

【讨论】:

  • 如果我设置ignorePath: false 尝试访问我的 api 端点时出现此错误:{ "success": false, "message": "Conversion failed when converting from a character string to uniqueidentifier." }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多