在 Google App Engine 上处理 /_ah/start 路由 NodeJ

nik*_*024 3 google-app-engine node.js express

我正在为我的 NodeJs 应用程序使用Google App Engine标准环境。一切正常,直到我在我的快递应用程序中注册了一条路线 '/*' 以捕获我的初始路线(如 '/'、'/login' 等)之后的所有路线。在 GAE 上部署我的应用程序后,我得到:

Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
Run Code Online (Sandbox Code Playgroud)

在我的 App Engine 构建日志中:

在此处输入图片说明 我的 app.yaml 看起来像: app.yaml

runtime: nodejs10
env: standard
service: default
health_check:
  enable_health_check: False
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10
Run Code Online (Sandbox Code Playgroud)

引自 GAE 官方文档:https : //cloud.google.com/appengine/docs/standard/nodejs/how-instances-are-managed

启动 每个服务实例都是为了响应启动请求而创建的,启动请求是对 /_ah/start 的空 HTTP GET 请求。App Engine 发送此请求以创建实例;用户无法向 /_ah/start 发送请求。手动和基本扩展实例必须先响应启动请求,然后才能处理另一个请求。启动请求可用于两个目的:

启动一个无限期运行的程序,不接受进一步的请求。在实例接收额外流量之前初始化实例。手动、基本和自动扩展实例的启动方式不同。当您启动手动扩展实例时,App Engine 会立即向每个实例发送 /_ah/start 请求。当您启动基本扩展服务的实例时,App Engine 允许它接受流量,但 /_ah/start 请求在收到第一个用户请求之前不会发送到实例。多个基本扩展实例仅在必要时启动,以处理增加的流量。自动扩缩实例不会收到任何 /_ah/start 请求。

当实例响应 /_ah/start 请求时,HTTP 状态码为 200-299 或 404,则认为它已成功启动并可以处理其他请求。否则,App Engine 将终止该实例。手动伸缩实例会立即重启,而基本伸缩实例仅在需要服务流量时才会重启。

我错过了什么吗?请帮忙。

提前致谢

nik*_*024 9

我通过将我的最后一条路线注册为这样解决了这个问题:

app.get(/^(?!.*_ah).*$/,(req,res,next)=>{
})
Run Code Online (Sandbox Code Playgroud)

与我之前的配置相比。

app.get('/*',(req,res,next)=>{
    })
Run Code Online (Sandbox Code Playgroud)

在这里我使用了negate regex归功于此 SO 答案

引自官方 GAE 文档

在实例接收额外流量之前初始化实例。手动、基本和自动扩展实例的启动方式不同。当您启动手动扩展实例时,App Engine 会立即向每个实例发送 /_ah/start 请求。

上面的路由处理程序所做的是捕获_ah除以 _ah/start 和 _ah/stop开头的路由之外的所有路由,因为我的应用程序不会侦听它们,因为 Google App 引擎使用它们来注册应用程序。

我希望这对未来的人有所帮助。

谢谢