如何将mgo Session推迟到完全流式传输到客户端?

时间:2016-07-22 16:25:04

标签: mongodb go deferred mgo revel

我希望在完全流式传输到客户端之后关闭一个mgo会话。起初,我认为这可能有效,但似乎defer只是等待func开始返回或者什么。

func (c App) OpenFile(fileId string) revel.Result {
    // convert string to bson.ObjectId
    objId := bson.ObjectIdHex(fileId)
    file, session := OpenFile(objId)
    defer session.Close()
    // memfile io.Reader, filename string, delivery ContentDisposition, modtime time.Time
    var now = time.Now()
    return c.RenderBinary(file, "filename", "inline", now)
}

1 个答案:

答案 0 :(得分:0)

我不知道您的defer session.Close()函数在做什么,但我假设它使用Mongo的GridFS来访问该文件。你是对的RenderBinary在回归之前被召唤。如果您使用文件Revel closes it automatically,但在您的情况下,您还想关闭会话。

唯一的解决方法是制作可由Revel在package main import ( "io" "os" "gopkg.in/mgo.v2" ) type MongoReader struct { io.Reader File *os.File Session *mgo.Session } func (mr *MongoReader) Read(p []byte) (n int, e error) { return mr.File.Read(p) } func (mr *MongoReader) Close() { mr.File.Close() mr.Session.Close() } func main() { mr := MongoReader{} mr.Session, mr.File = OpenFile("abababa") return c.RenderBinary(mr, "filename", "inline", now) } 中使用的自定义Reader。类似的东西:

os.File

我没有在Revel上测试它,但由于代码非常简单,我认为它应该可行。也许您需要一些{{1}}特定方法。