ExpressJS маршруты не разрешаются - PullRequest
0 голосов
/ 17 мая 2018

У меня есть небольшой микросервис, написанный на машинописи, работающий в кластере kubernetes на AKS.У меня есть вход, сгенерированный с помощью 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 приводит к ошибке 404 из экспресса

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

Я могу сказать, что ответ от экспрессасервер, потому что у него есть пользовательские заголовки ответа, установленные сервером.Я действительно смущен тем, что не так, любая помощь будет оценена.

1 Ответ

0 голосов
/ 21 мая 2018

Это не работает для вас, потому что ваш вход просто перенаправляет запрос https://test.xyz/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
...