Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 从Go on AppEngine中的init()函数获取URL_Google App Engine_Go_Spreadsheet_Mux - Fatal编程技术网

Google app engine 从Go on AppEngine中的init()函数获取URL

Google app engine 从Go on AppEngine中的init()函数获取URL,google-app-engine,go,spreadsheet,mux,Google App Engine,Go,Spreadsheet,Mux,背景:我正在运行Go-on-GAE并为我的路由器使用Mux。为了获取URL,GAE要求我使用其内置的urlFetch功能。我想在模块init()期间执行此URL获取,但据我所知,我只能在通过处理程序调用时使用urlFetch func init() { r := mux.NewRouter() r.HandleFunc("/", homeHandler) r.HandleFunc("/about", anotherHandler) http.Handle("/", r) } G

背景:我正在运行Go-on-GAE并为我的路由器使用Mux。为了获取URL,GAE要求我使用其内置的urlFetch功能。我想在模块init()期间执行此URL获取,但据我所知,我只能在通过处理程序调用时使用urlFetch

func init() {
  r := mux.NewRouter()
  r.HandleFunc("/", homeHandler)
  r.HandleFunc("/about", anotherHandler)
  http.Handle("/", r)
}
GAE建议使用以下代码进行urlFetch:

c := appengine.NewContext(r)
client := urlfetch.Client(c)
。。。但它的参数是http路由器,如果我通过我的mux路由器,它就不想工作。因此,我不知道如何在URL处理程序的作用域之外进行urlFetch


传递mux路由器时出错:“无法将r(type*mux.router)用作“appengine”的参数中的type*http.Request。NewContext”

您不能使用需要外部处理程序的appengine服务(因为创建
上下文需要一个值)。这本质上意味着您也不能在package
init()函数中使用它们。
注意,您可以从cron作业和添加到任务队列的任务中使用它们,因为任务和cron作业是通过发出httpget请求来执行的

您必须重新构造代码,以便从处理程序调用服务(在您的例子中是urlFetch)

func init() {
  r := mux.NewRouter()
  r.HandleFunc("/", homeHandler)
  r.HandleFunc("/about", anotherHandler)
  http.Handle("/", r)
}
一个可能的解决方案是检查服务于用户请求的处理程序中的init是否完成。如果没有,请在继续处理请求之前,执行本应放入
init()
中的初始化函数

是的,这可能会导致首次请求的服务时间较长。为此,我建议您使用。预热请求在新实例进入“活动”状态之前,即在它开始为用户请求提供服务之前,会发出给新实例。在
app.yaml
config文件中,您可以通过向
入站服务
指令添加
-warmup
来启用预热请求:

inbound_services:
  - warmup
这将导致应用程序引擎基础结构首先向
/\u ah/warmup
发出
GET
请求。您可以将处理程序注册到此URL并执行初始化任务。与任何其他请求一样,您将在预热处理程序中有一个

但请注意:

…即使应用程序中启用了预热请求,您也可能会遇到


这意味着在极少数情况下,新实例可能不会收到预热请求,因此最好也检查用户处理程序中的初始化状态。

“…但其参数是http路由器…”它不是http路由器,它是
*http.request
,因此显然不能传递
*mux.router
值。继续,谢谢你,伊卡!非常有帮助,热身的要求是正确的钱。