mongodb - 如何推迟 mgo session ,直到它完全流式传输到客户端?

标签 mongodb go deferred mgo revel

我想在 mgo session 完全流式传输到客户端后关闭它。起初,我认为这可能行得通,但似乎 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)
}

最佳答案

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

唯一的解决方法是在 RenderBinary 中创建 Revel 可以使用的自定义 Reader。像这样的东西:

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)
}

我没有在 Revel 上测试它,但由于代码非常简单,我认为它应该可以工作。也许您需要一些 os.File 特定方法。

关于mongodb - 如何推迟 mgo session ,直到它完全流式传输到客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38531267/

相关文章:

go - 延迟函数不恢复

AngularJS - 为什么用 $http 来 promise ($q) ?

python - 在 Ubuntu 上安装 Monary 0.4 时出错

mongodb - 根据小时和 driverID 获取特定记录

mongodb - Spring boot mongo - 如何从一个集合中引用其他集合中的文档

mongodb - 如何更改mongodb集合中字段的类型

将日期打印到控制台

mongodb - 如何在 mongo-go-driver 中使用 ParseExtJSONArray() 解析聚合管道中的扩展 JSON 日期

go - 如何在数组 go-gin 中拦截 ReST API 响应

javascript - 如何生成结果 Javascript 嵌套延迟