我想构建一个使用jrpc2和mongodb来管理小型IoT设备的微服务。这些是有问题的库:

https://godoc.org/bitbucket.org/creachadair/jrpc2

https://godoc.org/github.com/globalsign/mgo

问题是,对于Golang来说,它还算陌生,我不确定如何将这些东西结合在一起。这是我的代码:

func DeviceAdd(ctx context.Context) (map[string]string, error) {
    m := make(map[string]string)
    m["token"] = "0xdeadbeef"
    return m, nil
}

func DeviceBootstrap(ctx context.Context, params map[string]string) (map[string]string, error) {
    m := make(map[string]string)
    m["entered_token"] = params["token"]
    return m, nil
}
...
func NewServer() *jrpc2.Server {
    assigner := jrpc2.MapAssigner{
        "device_add":        jrpc2.NewHandler(DeviceAdd),
        "device_bootstrap":  jrpc2.NewHandler(DeviceBootstrap),
        "device_update":     jrpc2.NewHandler(DeviceUpdate),
        "device_get_status": jrpc2.NewHandler(DeviceGetStatus),
    }
    srv := jrpc2.NewServer(assigner, nil)
    return srv
}

基本上,您编写了一些接受上下文的基本函数.Context或任何其他JSON-RPC参数,并且jrpc2.NewHandler(function)会将它们附加到jrpc2.Server。

问题是,我无法更改函数处理程序签名以在其中放置mgo.Session。还是应该使结构的DeviceAdd / DeviceBootstrap方法可以访问mgo.Session?

根据another StackOverflow question,似乎我应该使具有mgo.Session的结构的DeviceAdd / DeviceBootstrap方法,但是我真的不确定我是否正确理解它,或者jrpc2.NewHandler是否接受新转换的方法,或者这是正确的事情。此外,Golang的context.Context似乎是放置此类内容的正确位置。帮帮我!

最佳答案

可以通过实现jrpc2.Handler接口的任何值来处理请求。使mgo.Session适应此接口的最简单方法可能是将其包装在一个结构中,例如,

type SessionHandler struct {
    mgo.Session
}

func (s SessionHandler) Handle(ctx context.Context, req *jrpc2.Request) (interface{}, error) {
   // whatever you want your handler to do, using the s.Session
   // as a delegate.
}

然后,您可以编写如下内容:

a := handler.Map{"DoAThing": SessionHandler{s}}

将其插入服务器。

关于mongodb - 如何将mongodb session 放入creachadair/jrpc2处理程序中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54025725/

10-11 06:54