node.js - 「 '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.
这个问题的解决方案是什么?
解决方案
CosmosDB 是与 MongoDB 不同的服务器实现,并且某些功能和行为有所不同。
Cosmos 目前仅支持 Cosmos内部修改时间戳字段_ts
的 TTL 索引:
_ts是 Cosmos DB 特定的字段,不能从 MongoDB 客户端访问。它是一个保留的(系统)属性,包含文档最后修改的时间戳。
由于 connect-mongo
使用了一个expires
为ttl
值调用的字段,因此默认情况下它不适用于 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
您可以使用设置查询运行频率以删除过期文档的选项来调整计时器间隔。
推荐阅读
- html - 如何更改引导程序 4 轮播中的导航按钮?
- c# - 在绑定列上设置元素集合的 DataGridViewComboBoxColumn 不允许用户下拉
- vuejs2 - 如何在 vue2-daterange-picker 中实现“清除”按钮?
- azure-active-directory - Azure AD Enterprise 应用程序角色更改不会触发 Zoom 或 DocuSign 的预配更新
- vue.js - 如何在 CSS 背景中使用 BASE_URL 等 vue.js 环境变量:url(...)
- javascript - 在 Table Javascript 中添加行数
- github - 如何在詹金斯的任意网址部署 git hub 拉取请求?
- python - TensorFlow / Keras Python CNN
- r - 将一个组与 R 中的其他组作为一个整体进行比较
- c - 如何使用 C (Linux) 向所有终端发送消息?