Nodejs 请教 Express 4 中如何使用connect-mongo

Nodejs 请教 Express 4 中如何使用connect-mongo

https://github.com/nswbmw/N-blog/wiki/第1章–一个简单的博客

正在跟随上面的教程一步一步做,在会话支持那一节中安装 connect-mongo 后,添加:

var MongoStore = require('connect-mongo')(express);
var settings = require('./settings');
和
app.use(express.cookieParser());
app.use(express.session({
 // ......
  })
}));

之后运行报错:

Error: Most middleware (like session) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware. 

求问在 Express 4 中该如何处理这个中间件


12 回复

当然可以!在 Express 4 中,express 库本身不再包含许多中间件,包括 cookieParsersession。你需要单独安装这些中间件。以下是针对你提到的问题的具体步骤和示例代码。

安装必要的依赖

首先,确保你已经安装了以下依赖:

npm install express connect-mongo cookie-parser

示例代码

接下来,你需要更新你的代码以适应 Express 4 的变化。下面是完整的示例代码:

// 导入必要的模块
const express = require('express');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const MongoStore = require('connect-mongo')(session); // 使用新的语法
const settings = require('./settings');

// 创建应用实例
const app = express();

// 使用 cookieParser 中间件
app.use(cookieParser());

// 使用 session 中间件,并配置 MongoDB 存储
app.use(session({
    secret: settings.cookieSecret, // 你的密钥
    key: settings.db, // cookie 名称
    cookie: { maxAge: 1000 * 60 * 60 * 24 * 30 }, // 设置过期时间(毫秒)
    store: new MongoStore({ // 使用 connect-mongo 作为存储
        url: settings.url // MongoDB 连接字符串
    }),
}));

// 示例路由
app.get('/', (req, res) => {
    req.session.name = 'John Doe'; // 设置 session
    res.send('Hello World!');
});

// 启动服务器
const port = process.env.PORT || 3000;
app.listen(port, () => {
    console.log(`Server is running on port ${port}`);
});

解释

  1. 导入模块

    • express 是核心框架。
    • cookie-parser 用于解析 cookies。
    • express-session 用于处理 sessions。
    • connect-mongo 用于将 sessions 存储到 MongoDB 中。
  2. 创建应用实例

    • const app = express(); 创建了一个 Express 应用实例。
  3. 使用中间件

    • app.use(cookieParser()); 使用 cookieParser 中间件来解析 cookies。
    • app.use(session({...})) 使用 express-session 中间件,并配置 MongoStore 来将 session 数据存储到 MongoDB 中。
  4. 配置 MongoDB 存储

    • store: new MongoStore({ url: settings.url }) 配置了 MongoStore 使用指定的 MongoDB 连接字符串。
  5. 启动服务器

    • app.listen(port, ...) 启动服务器并监听指定端口。

通过以上步骤,你应该能够成功地在 Express 4 中使用 connect-mongo 来管理 session 数据。希望这对你有帮助!


express 4 跟之前很不同。 比如 express.session 和 express.cookieParser 都已经不存在了。 express 和 中间件已经剥离了,除了 express.static。

我改成了这样: var MongoStore = require(‘connect-mongo’)(connect); var settings = require(’./settings’); var connect = require(‘connect’);

app.use(cookieParser()); app.use(connect.session({ //… }));

我把connect-mongo.js也换成了git上的兼容4.x的版本, 也用npm安装了connect,运行报错: var Store = connect.Store || connect.session.Store; ^ TypeError: Cannot read property ‘Store’ of undefined

恩,读了一下各个的说明,按照新的规则试着改了改,结果还是出错,有些头大,代码在二楼

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

app.use(session({ secret: settings.cookieSecret, store: new MongoStore({ db: settings.db }) }));

我这样子好像就OK了。

谢谢,可以了!令我奇怪的是我之前也有尝试过使用express-session,但是依旧出错。 看了你的回答之后我调整了一下代码顺序结果成功了,应该是我的代码顺序不对造成的。

朋友,您好,可以一同交流一下吗?您的qq是多少呢?

我也在写这个例子,感觉书中的代码都过时了,这个头大,希望可以交流一下,指点一下小弟

书中是基于Express 3.x 版本进行开发的, 在 Express 升级到4.x 之后session中间件已经不再内置了, 需要自己安装, 并且使用方式也不一样了. Express 4.x 中使用方式改为了这样:

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

app.use(session({ secret: ‘foo’, store: new MongoStore(options) }));

而 Express 3.x 中是这样的:

var MongoStore = require('connect-mongo')(express);

app.use(express.session({
    secret: 'foo',
    store: new MongoStore(options)
}));

LS正解

在 Express 4 中,express 框架的内部中间件已经被分离出来,并且需要单独安装。因此你需要使用 express-sessionconnect-mongo 来实现会话存储。以下是具体的步骤和示例代码:

首先,确保你已经安装了所需的包:

npm install express express-session connect-mongo --save

接下来,在你的应用文件中,你可以这样配置 express-sessionconnect-mongo

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

const app = express();

// 配置 session 中间件
app.use(session({
    secret: settings.cookieSecret, // 用于签名 cookie 的密钥
    key: 'express.sid',            // 默认情况下 cookie 的名称
    resave: false,
    saveUninitialized: true,
    store: new MongoStore({        // 使用 MongoDB 存储 session 数据
        url: settings.db // MongoDB 连接字符串
    })
}));

// 其他路由和中间件

在这段代码中:

  • secret 是一个用来对 session cookie 签名的密钥。
  • key 定义了存储在 cookie 中的键值名称。
  • resave 控制是否每次请求都重新保存 session。
  • saveUninitialized 控制未初始化的 session 是否保存到存储中。
  • store 是一个 MongoStore 实例,用于将 session 数据存储在 MongoDB 中。

最后,确保 settings.js 文件中包含了正确的数据库连接字符串和其他必要的设置。

通过这种方式,你可以成功地在 Express 4 中使用 connect-mongo 来存储 session 数据。

回到顶部