Nodejs Error setting TTL index on collection sessions 错误求解答

Nodejs Error setting TTL index on collection sessions 错误求解答

基于本论坛源码搭建了一个论坛,从version 0.3.2版本,升级到 version 0.4.0版本时,报如下错误: C:\dev\nodejs\dcweb2\node_modules\connect-mongo\node_modules\mongodb\lib\mongodb\connection\base.js:242 throw message; Error: Error setting TTL index on collection : sessions at C:\dev\nodejs\dcweb2\node_modules\connect-mongo\lib\connect-mongo.js:161:23 求各位大神给予指导,谢谢!!


8 回复

Nodejs Error setting TTL index on collection sessions 错误求解答

问题描述

在将一个基于Node.js的论坛从version 0.3.2版本升级到version 0.4.0版本时,遇到了以下错误:

C:\dev\nodejs\dcweb2\node_modules\connect-mongo\node_modules\mongodb\lib\mongodb\connection\base.js:242
throw message;
Error: Error setting TTL index on collection : sessions
at C:\dev\nodejs\dcweb2\node_modules\connect-mongo\lib\connect-mongo.js:161:23

解决方案

这个错误通常发生在使用connect-mongo库时,尝试为MongoDB中的sessions集合设置TTL(Time To Live)索引失败。TTL索引用于自动删除过期的数据。

解决方案步骤:

  1. 检查MongoDB版本: 确保你的MongoDB版本支持TTL索引。大多数现代版本的MongoDB都支持TTL索引。

  2. 手动创建TTL索引: 你可以尝试手动创建TTL索引,以确保没有配置错误。

const MongoClient = require('mongodb').MongoClient;

// 连接字符串
const url = 'mongodb://localhost:27017';

// 数据库名称
const dbName = 'your_database_name';

MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
  if (err) throw err;
  console.log("数据库已连接");
  
  const db = client.db(dbName);
  
  // 手动创建TTL索引
  db.collection('sessions').createIndex({ "expires": 1 }, { expireAfterSeconds: 0 }, (err, result) => {
    if (err) throw err;
    console.log("TTL索引已创建:", result);
    
    // 关闭数据库连接
    client.close();
  });
});

代码解释:

  • createIndex 方法用于创建一个新的索引。
  • 第一个参数是一个对象,定义了需要索引的字段及其排序方式(例如 { "expires": 1 } 表示按升序对 expires 字段进行索引)。
  • 第二个参数是一个对象,包含索引的选项,如 expireAfterSeconds 设置为 0 表示文档将在其 expires 字段值到达后自动删除。
  1. 检查connect-mongo版本: 确保你使用的connect-mongo版本与MongoDB版本兼容。可以通过更新connect-mongo来解决这个问题:
npm install connect-mongo@latest

通过以上步骤,你应该能够解决这个错误并使应用正常运行。如果问题仍然存在,请检查是否有其他配置或依赖项问题。


这个一般是connect-mongo没有初始化完毕httpServer就启动造成的,不是每次都发生,应该是个bug

connect-mongo的官方bug吧,修改下package.json,更新到最新的connct-mongo,可解决

我遇到同样问题,关键是代码次序:

app.use(session({
    secret: settings.cookieSecret,
    key: settings.db,//cookie name
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 30 },//30 days
    store: new MongoStore({
        db: settings.db,
        host: settings.host,
        port: settings.port
    }),
    resave: true,
    saveUninitialized: true
}));

// app.use(flash());

module.exports = app;

若将app.use(session(…))app.use(flash()); 放在app.js 前面,则报error setting TTL index …

我重试我的代码,又出现Error setting TTL index on collection : sessions 问题,看来我之前的判断是错误,

可是根据stackoverflow, 更新 connect-mongo,从0.4.1 升级到0.8.0,又报新错误i: cannot read property length of undefined,

Why?

我把我mongodb里的存数据的文件里的内容删掉 就出现这个问题了 不知道为什么

将mongodb和connect-mongo都跟新到最新版本 在package.json修改 "mongodb":“2.0.42”, “connect-mongo”:“0.8.2”

在从 version 0.3.2 升级到 version 0.4.0 的过程中,你遇到了一个关于设置 TTL 索引的错误。这通常发生在使用 connect-mongo 库来管理 MongoDB 会话时。

问题分析

当你将项目从旧版本升级到新版本时,可能会遇到数据库结构不兼容的问题。connect-mongo 在新版本中可能对存储在 MongoDB 中的会话数据进行了结构调整,而旧的数据结构可能导致新版本无法正确设置 TTL 索引。

解决方案

方法一:删除旧的会话数据

你可以手动删除 MongoDB 中的 sessions 集合,让应用在下次启动时自动创建新的集合和索引。

# 使用 MongoDB Shell 连接到你的数据库并删除 sessions 集合
mongo
use <your-database-name>
db.sessions.drop()
exit

方法二:手动创建 TTL 索引

如果上述方法不可行或你希望保留某些旧数据,可以尝试手动创建 TTL 索引:

const MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/<your-database-name>', { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
    if (err) throw err;
    const db = client.db();
    db.collection('sessions').createIndex({ 'expires': 1 }, { expireAfterSeconds: 0 }, (err, result) => {
        if (err) throw err;
        console.log('TTL index created successfully');
        client.close();
    });
});

总结

以上两种方法都可以帮助解决 Error setting TTL index on collection : sessions 错误。如果你不介意丢失旧的会话数据,直接删除 sessions 集合可能是最简单的方法。如果你需要保留数据,手动创建 TTL 索引则是一个更安全的选择。

希望这些建议能帮到你!

回到顶部