Nodejs疑问,connect-mongo.js中出错 var Store = connect.session.Store;

Nodejs疑问,connect-mongo.js中出错
var Store = connect.session.Store;

终端出错显示是:Cannot read property ‘Store’ of undefined,我开始以为是Store没有定义,就去app.js这个系统入口文件里去看,发现: app.use(express.session({ secret: settings.cookieSecret, store: new MongoStore({ db: settings.db }) })); 发现可能是这个store写错了,于是我将其改为Store。但是重启服务器,终端还是报相同错,我于是又找了一些文件看,发现也没有什么问题(ps:之前终端一直报找不着…/settings,这个问题,我后来改好了,个人感觉书上得代码,可能有问题)


16 回复

根据你描述的情况,错误提示 Cannot read property 'Store' of undefined 表明 connect.session.Store 未被正确识别或加载。这通常是因为 express-session 库的版本更新后,API 发生了变化。

解决方案

  1. 确保依赖正确安装: 首先,确保你已经安装了正确的依赖包。你需要安装 express-sessionconnect-mongo

    npm install express-session connect-mongo
    
  2. 修正代码: 更新你的代码以适应当前版本的 express-session。在较新的版本中,connect.session.Store 已经不再存在。你应该使用 Session 类,并且通过 session 模块来创建存储对象。

    下面是一个示例代码:

    const express = require('express');
    const session = require('express-session');
    const MongoStore = require('connect-mongo')(session);
    
    const app = express();
    
    app.use(session({
      secret: 'your-secret-key',
      resave: false,
      saveUninitialized: true,
      store: new MongoStore({
        url: 'mongodb://localhost:27017/mydatabase'
      })
    }));
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  3. 检查路径和设置文件: 确保你的 settings.js 文件路径正确,并且包含必要的配置项(如 cookieSecretdb)。

    // settings.js
    module.exports = {
      cookieSecret: 'your-cookie-secret',
      db: 'mongodb://localhost:27017/mydatabase'
    };
    
  4. 确保数据库连接正确: 确保 MongoDB 服务正在运行,并且你可以通过 mongo 命令行工具连接到它。

总结

通过上述步骤,你应该能够解决 Cannot read property 'Store' of undefined 的错误。主要的更改点在于使用 express-session 提供的 MongoStore,而不是尝试访问已不存在的 connect.session.Store。希望这些信息能帮助你解决问题!


改成 var MongoStore = require(‘connect-mongo’)(express);

或者 安装MongoDB
1:修改package.json
"dependencies": { “express”: “3.1.0”, “ejs”: “*”, “connect-mongodb”: “>= 0.1.7”, “mongodb”:">=0.9.9" } 2 :改成 var MongoStore = require(‘connect-mongodb’);

希望能帮到你

楼上正解,我试过了可行

谢谢,可以了

…/settings 改成./settings var MongoStore = require(‘connect-mongodb’);

有个db.js 是放到根目录的model下么 这个model还得新建吧

你是怎么解决找不到…/settings的问题的?

我改成var MongoStore = require(‘connect-mongodb’)后,访问页面出现以下错误: 500 TypeError: Cannot call method ‘findOne’ of null

请问connect-mongo和connect-mongodb的区别是?

有答案了么? 我也遇到了,刷新首页就这样. 500 TypeError: Cannot call method ‘findOne’ of null at MongoStore.MONGOSTORE.get (/Users/zhangnaixiao/Cold/node/NodeGuide/Chapter05/MicroBlog/node_modules/connect-mongodb/lib/connect-mongodb.js:115:15)

现在用 var MongoStore = require(‘connect-mongo’)(express); 可以解决

同问。 试了重新install connect-mongodb(不知道connect-mongo和connect-mongodb的区别)还是不行,“…/settings”还是找不到,settings和app是放在同个目录下,应该不用加"…/"吧?还有settings不是modules里面的工具,可以用require吗?

试了重新install connect-mongodb(不知道connect-mongo和connect-mongodb的区别)还是不行,“…/settings”还是找不到,settings和app是放在同个目录下,应该不用加"…/"吧?还有settings不是modules里面的工具,可以用require吗?

express 4和3的区别 我在学习《Node.js实战》这边讲的是express 3.x 现在express4和3有些区别 有空看我https://github.com/strongloop/express/tree/master/examples这些例子或许就解决不少疑惑了

根据你的描述,错误提示 Cannot read property 'Store' of undefined 表明你在尝试访问一个未定义对象的属性。在你的代码片段中,问题出在 connect.session.Store 上。

connect.session.Store 是 Connect 框架的一个抽象类,用于自定义会话存储。在较新的版本中,Express 已经不再直接使用 connect.session.Store 这个路径。你需要安装 connect-mongo 并正确配置它。

示例代码

首先确保你已经安装了所需的依赖:

npm install express-session connect-mongo --save

然后在你的应用中正确配置 express-sessionconnect-mongo

const express = require('express');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session);

const app = express();

app.use(session({
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: false,
    store: new MongoStore({
        url: 'mongodb://localhost:27017/session-db'
    })
}));

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

关键点解释

  • express-session:这是 Express 的会话中间件。
  • connect-mongo:这是一个连接 MongoDB 的会话存储中间件。
  • MongoStore:使用 require('connect-mongo')(session) 获取存储类,避免直接引用 connect.session.Store

可能的问题

  • 确保 connect-mongo 安装成功。
  • 确保 MongoDB 服务正在运行,并且数据库名称与 url 中的一致。
  • 确保你的 secret 是一个安全的字符串。

如果还有其他错误信息或需要进一步的帮助,请提供更多的日志信息。

回到顶部