用于SPA和客户端路由的AppEngine dispatch.yaml

时间:2018-03-22 15:48:46

标签: google-app-engine go

我有一个Go服务器,其中有一个API和一个带有SPA(单页应用程序)的静态客户端build文件夹。由于SPA应该有客户端路由,我必须确保所有路径都映射到前端。例如,http://myapp.com/djaksfjal不应在浏览器中显示404,它应始终路由到我的SPA中的路线。

现在我还想拥有一个后端API,因此/api的所有请求都应该转到Go后端。

问题:如何使用AppEngine进行设置?我尝试了两个app.yaml个文件和一个dispatch.yaml文件,但无法让它工作。

客户端的app.yaml

runtime: go
api_version: go1
service: default

handlers:
- url: /
  static_files: build/index.html
  upload: build/index.html
- url: /*
  static_dir: build

服务器-app.yaml中

runtime: go
api_version: go1
service: test-backend

handlers:
- url: /api/*
  script: _go_app

dispatch.yaml

dispatch:
  - url: "*/api/*"
    service: test-backend

hello.go 包主要

import (
        "fmt"
        "net/http"
        "google.golang.org/appengine"
)

func main() {
        http.HandleFunc("/api/hello", handle)
        appengine.Main()
}

func handle(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello, world!")
}

然后运行dev_appserver.py server-app.yaml client-app.yaml dispatch.yaml并转到调度服务器所在的localhost:8080。但是,这不起作用。客户端路由接管所有内容,忽略/api/hello路由。

经过测试:localhost:8080 / api / hello。 期待:api路由回复。 得到:静态客户回复

如果我将client-app.yaml更改为不使用*,则/api/hello路由可以正常工作,但当然客户端路由不起作用,因为我需要 all < / em>路由到客户端,以便它可以自己处理路由(/api路由除外)。

1 个答案:

答案 0 :(得分:2)

dispatch.yaml文件中的规则顺序很重要 - 第一个模式匹配获胜。所以你首先想要*/api

此外 - 如果规则模式都不匹配请求将是default服务的路由器,则无需为此添加规则。

我还看到您提到了/api/hello请求路径 - 要使其工作,您可能需要将*/api模式扩展为*/api/*

所以我使用这个dispatch.yaml文件:

dispatch:
  - url: "*/api/*"
    service: test-backend

您还需要展开{​​{1}}文件中的/api模式,否则server-app.yaml会提供404:

/api/hello

附注:您不应该(需要)转到handlers: - url: /api/* script: _go_app - 这只会将您发送到默认服务。而是请注意开发服务器在服务器启动时显示的每个模块/服务所侦听的各个端口。