首页 > 解决方案 > mongo-go-driver 上下文包装函数

问题描述

所有 mongo-go-driver 的数据库查询方法都接受一个上下文:

func (coll *Collection) Find(ctx context.Context, ...)

通常将带有超时的 http 请求上下文的子项传递给这些查询方法:

ctx, cancel = context.WithTimeout(request.Context()), 5*time.Second)
defer cancel()
cur, err := collection.Find(ctx, ...)

这会在 Web 应用程序的代码库中创建大量样板。我正在考虑创建在内部创建上下文的包装函数:

func (db *Database) FindWithContext(filter interface{}) error {
  ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
  defer cancel()  
  return db.Collection.Find(ctx, filter)
}

这是一个不好的做法吗?上下文是否应该是 http 请求的子级,以便超时和取消在处理程序内进行?创建包装函数会破坏上下文的全部目的吗?

标签: mongodbgo

解决方案


如果这对你有用,我认为按照你的建议去做没有问题。Go 驱动程序通常使用起来很冗长。

请注意,大多数驱动程序并未按照 Go 驱动程序建议的使用方式为每个操作指定超时。

您可以考虑通过 URI 选项设置套接字超时,这可以为整个程序完成一次,但与每次操作超时并不完全相同。

另请注意,通常正在努力改进驱动程序中的每次操作超时处理。


推荐阅读