枸杞能在Google App Engine/Go中使用吗?

5
我希望使用Goji和Google App Engine/Go开发应用程序。
我从https://github.com/zenazn/goji复制并粘贴了示例代码,并将函数名称从“main”更改为“init”。
package main

import (
    "fmt"
    "net/http"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])
}

func init() {
    goji.Get("/hello/:name", hello)
    goji.Serve()
}

并运行此应用程序

 # goapp serve

但是这个应用程序显示:
 bad runtime process port ['']

 2014/06/01 08:35:30.125553 listen tcp :8000: bind: address already in use

我能在 GAE/Go 中如何使用 Goji?或者我不能在 GAE/Go 中使用 Goji?
2个回答

5

init函数是特殊的,因为它们会自动运行以初始化模块。通过在init函数中提供您的应用程序,您已经在代码初始化中途停止了(因为goji.Serve从不终止)。可能发生的情况是有些内容依赖于运行时标志,而您在解析之前就运行了。

您可以编写一个单一的应用引擎处理程序,将服务转发到goji.DefaultMux。我还没有测试过它,但类似这样的东西应该可以工作:

import (
    "fmt"
    "github.com/zenazn/goji"
    "net/http"
)

func init() {
    http.Handle("/", goji.DefaultMux)
    ... Register your goji handlers here
}

谢谢!我将“HandleFunc”更改为“Handle”,现在它可以正常工作了。 - yosuke

2

这在我的开发服务器上运行良好。

package main

import (
    "fmt"
    "net/http"

    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"
)

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "index page")
}

func hello(c web.C, w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, %s!", c.URLParams["name"])
}

func init() {
    http.Handle("/", goji.DefaultMux)
    goji.Get("/", index)
    goji.Get("/hello/:name", hello)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接