首页 > 解决方案 > 「 'expireAfterSeconds' 选项仅在 '_ts' 字段上受支持。》 错误显示

问题描述

我在 node.js 中使用 cosmos db 进行会话存储。而 cosmos db 版本是 3.6 。

我执行以下代码。

const expressSession = require("express-session");
const MongoStore = require("connect-mongo")(expressSession);
const store = new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl:24 * 60 * 60 * 1000,
})

结果,显示以下消息。

  (node:16068) UnhandledPromiseRejectionWarning: MongoError: The 'expireAfterSeconds' option is supported on '_ts' field only.

这个问题的解决方案是什么?

标签: node.jsazure-cosmosdbazure-cosmosdb-mongoapi

解决方案


CosmosDB 是与 MongoDB 不同的服务器实现,并且某些功能和行为有所不同。

Cosmos 目前仅支持 Cosmos内部修改时间戳字段_ts的 TTL 索引:

_ts是 Cosmos DB 特定的字段,不能从 MongoDB 客户端访问。它是一个保留的(系统)属性,包含文档最后修改的时间戳。

由于 connect-mongo使用了一个expiresttl值调用的字段,因此默认情况下它不适用于 Cosmos。

但是,您可以通过使用 connect-mongo's兼容模式来解决此问题,该模式在 Node 应用程序中使用效率较低的基于计时器的方法,而不是 MongoDB 服务器支持的本机 TTL 索引:

const store = new MongoStore({
        mongooseConnection: mongoose.connection,
        ttl:24 * 60 * 60 * 1000,
        autoRemove: 'interval',
        autoRemoveInterval: 10 // Value in minutes (default is 10)
})

autoRemoveInterval您可以使用设置查询运行频率以删除过期文档的选项来调整计时器间隔。


推荐阅读