如何将 mongodb 会话放入 creachadair/jrpc2 处理程序中

Posted

技术标签:

【中文标题】如何将 mongodb 会话放入 creachadair/jrpc2 处理程序中【英文标题】:How to put mongodb sessions in creachadair/jrpc2 Handlers 【发布时间】:2019-01-03 15:56:25 【问题描述】:

我想构建一个使用 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.Context 或任何其他 JSON-RPC 参数的基本函数,jrpc2.NewHandler(function) 会将它们附加到 jrpc2.Server。

问题是,我无法更改函数处理程序签名以将 mgo.Session 放在那里。或者我应该为可以访问 mgo.Session 的结构创建 DeviceAdd/DeviceBootstrap 方法?

根据another *** question,看来我应该为具有mgo.Session 的结构创建DeviceAdd/DeviceBootstrap 方法,但我真的不确定我是否理解正确,或者jrpc2.NewHandler 是否会接受新的转换的方法,或者如果它是正确的做法。此外,Golang 的 context.Context 似乎是放置此类东西的正确位置。救命!

【问题讨论】:

你可以使用结构体,你可以使用闭包,你可以使用Context,这完全取决于你。我个人尽量避免使用 Context 值,因为它们放弃了编译时类型安全。 【参考方案1】:

可以通过任何实现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": SessionHandlers

将其插入您的服务器。

【讨论】:

以上是关于如何将 mongodb 会话放入 creachadair/jrpc2 处理程序中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用数组将数据放入 laravel 会话?

如何将mongodb项目放入discord bot的变量中?

如何在不单击任何按钮的情况下将复选框值放入会话变量中?

为啥我应该在 MongoDB 中使用 NodeJS 在会话案例中搜索用户?

如何配置支持会话的 MongoDB 集群?

如何从 mongodb 获取数据以放入选项中?