我正在为NodeJs应用程序使用Google App Engine标准环境。一切正常,直到我在Express应用程序中注册了路由“ / *”以捕获初始路由(例如“ /”,“ / login”等)之后的所有路由。在GAE上部署我的应用程序后,我得到了:
Error: Server Error
The server encountered an error and could not complete your request.
Please try again in 30 seconds.
在我的App Engine构建日志中:
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
引用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请求。
当实例使用200–299或404的HTTP状态代码响应/ _ah / start请求时,它被视为已成功启动并可以处理其他请求。否则,App Engine将终止实例。手动伸缩实例将立即重新启动,而基本伸缩实例仅在需要服务流量时才重新启动。
我想念什么吗?请帮忙。
提前致谢
我通过注册我的最后一条路线来解决此问题:
app.get(/^(?!.*_ah).*$/,(req,res,next)=>{
})
与我之前的配置相比
app.get('/*',(req,res,next)=>{
})
在这里,我使用了否定正则表达式。相信这个答案
在实例收到其他流量之前对其进行初始化。手动,基本和自动扩展实例的启动方式有所不同。启动手动扩展实例时,App Engine会立即向每个实例发送一个/ _ah / start请求。
上面的路由处理程序所做的是捕获除以开头的_ah
那条路由以外的所有路由,这意味着_ah / start和_ah / stop将不会被我的应用程序监听,因为它们被Google App引擎用于注册该应用程序。
我希望这对以后的人有所帮助。
谢谢
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句