如何禁用/关闭/刷新couchdb缓存

时间:2013-02-19 00:30:54

标签: caching couchdb

我有一个列表,对文档有一些基本的身份验证。我遇到的问题是列表正在缓存,因此除非我更新修订版ID,否则用户将看不到它们具有访问权限。如何显示非缓存列表?

if (req.userCtx.name === doc.permissions.owner) {
    return 'you have permission';   
}
else {
    return 'you do not';
}

我怎么想象它完成的是通过传递no-cache或更新标题中的ETAG或类似的东西,但似乎没有任何效果。这是我的尝试,每次都会在头部发送一个新的日期,使其不是缓存,但这不起作用。

var date = new Date().getTime() + 'x';
start({code: 200, headers: {'Content-Type': 'text/html', 'date': date}});

任何想法都非常感谢!

顺便说一句,我正在寻找纯粹的沙发解决方案。

2 个答案:

答案 0 :(得分:1)

所以经过多次挖掘后我发现了这个:

http://wiki.apache.org/couchdb/Formatting_with_Show_and_List#ETags

切入重要部分:

  • ETag由List and Shows处理
  • 版本高达1.2,您的用户必须拥有一个角色,然后他们将获得不同的ETag。
  • 1.3将为每个用户名引入新的ETag。

希望这有助于某人。

答案 1 :(得分:1)

幸运的是CouchDB资源可用!我能够在couch_mrview_show.erl中找到这个算法:

show_etag(#httpd{user_ctx=UserCtx}=Req, Doc, DDoc, More) ->
    Accept = couch_httpd:header_value(Req, "Accept"),
    DocPart = case Doc of
        nil -> nil;
        Doc -> couch_httpd:doc_etag(Doc)
    end,
    couch_httpd:make_etag({couch_httpd:doc_etag(DDoc), DocPart, Accept,
        {UserCtx#user_ctx.name, UserCtx#user_ctx.roles}, More}).

在这里,我们可以看到节目被缓存,除非以下某项内容发生了变化:

  • 设计doc,其中包含show function
  • 用于渲染节目的文档
  • '接受'HTTP请求标题
  • 用户名(表示每个用户至少呈现一次展示)
  • 用户上下文中的用户角色集