【问题标题】:ExpressJS routes not resolvingExpressJS 路由无法解析
【发布时间】:2018-05-17 10:11:48
【问题描述】:

我有一个用 typescript 编写的小型微服务,在 AKS 上的 kubernetes 集群中运行。 我使用 Helm 生成了入口

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-service
  labels:
    app: test-service
    chart: test-service-0.1.0
    release: test-service
    heritage: Tiller
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
spec:
  tls:
    - hosts:
        - test.xyz
      secretName: default-tls
  rules:
    - host: test.xyz
      http:
        paths:
          - path: /payments
            backend:
              serviceName: test-service
              servicePort: 4040

还有服务

apiVersion: v1
kind: Service
metadata:
  name: existing-bumblebee-payments-service
  labels:
    app: test-service
    chart: test-service-0.1.0
    release: existing-bumblebee
    heritage: Tiller
spec:
  type: ClusterIP
  ports:
    - port: 4040
      targetPort: 4040
      protocol: TCP
  selector:
    app: test-service
    release: existing-bumblebee

在我的微服务中

export class Server {
private registerRoutes() {
        this.app.use("/cards", CardRouter);
        this.app.use("/wallets", WalletRouter);
        this.app.use("/preauth", PreauthRouter);
        this.app.use("/charge", ChargeRouter);
    }
}

路由器看起来像这样;

    import { Router } from "express";
    // other imports
    import { checkSchema, check } from "express-validator/check";

    const router = Router();

    router.get("/", CardController.index);
    router.get("/:id", [
        check("id")
            .isUUID()
            .withMessage("Invalid UUID")
    ], CardController.get);
    router.delete("/:id", [
        check("id")
            .isUUID()
            .withMessage("Invalid UUID")
    ], CardController.remove);
    router.post("/", checkSchema(CardCreateRules), CardController.add);

export default router;

但是通过https://test.xyz/payments/cards访问服务会导致express出现404错误

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>Error</title>
    </head>
    <body>
        <pre>Cannot GET /payments/cards</pre>
    </body>
</html>

我可以判断响应来自快速服务器,因为它具有服务器设置的自定义响应标头。 我真的很困惑出了什么问题,任何帮助将不胜感激。

【问题讨论】:

  • 这里没有足够的信息来解决问题。 test.xyz 的 DNS 中的 IP 绝对是您创建的 nginx 入口的 IP,并且仍不指向默认入口吗?
  • @SimonMcClive 是的。该 IP 由 Azure AKS 预配。
  • 你有你的服务定义/NodePort定义yaml你可以分享。
  • @SimonMcClive 我已经用服务定义更新了帖子
  • 您的路由器是什么样的?你能举个例子吗?

标签: javascript typescript express kubernetes-helm kubernetes-ingress


【解决方案1】:

这对你不起作用,因为你的入口只是将请求 https://test.xyz/payments/cards 重定向到 test-service而不重写路径。所以测试服务还是变成了请求“/payments/cards”,显然不能处理。

您可以重新配置 express 应用程序以支持 /payments/cards 或通过 ingess 'nginx.ingress.kubernetes.io/rewrite-target' 注释进行路径重写:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-service
  labels:
    app: test-service
    chart: test-service-0.1.0
    release: test-service
    heritage: Tiller
  annotations:
    ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
    kubernetes.io/tls-acme: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /payments
spec:
  tls:
    - hosts:
        - test.xyz
      secretName: default-tls
  rules:
    - host: test.xyz
      http:
        paths:
          - path: /
            backend:
              serviceName: test-service
              servicePort: 4040

【讨论】:

  • 哦,哇,从来不知道nginx.ingress.kubernetes.io/rewrite-target 注释。我试试看
猜你喜欢
  • 2023-03-26
  • 2014-12-09
  • 2016-04-26
  • 2016-05-17
  • 2015-03-30
  • 1970-01-01
  • 2014-11-14
  • 2017-06-16
  • 2017-04-05
相关资源
最近更新 更多