解释要求(' connect-mongo')(会话);

时间:2015-09-28 19:36:48

标签: javascript node.js

过去几周我一直在积极学习JS / MEAN堆栈,但我错过了我们对(session)所做的事情。我们是从var session = require('express-session');添加对象还是添加了什么??

感谢您的任何澄清。

2 个答案:

答案 0 :(得分:0)

这只是简单的链接。来自https://www.npmjs.com/package/connect-mongo

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

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

可以重写为

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

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

这会回答你的问题吗?

答案 1 :(得分:0)

所以在我看来,这是你不明白的主要内容:

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

所以让我们稍微分解一下。第一部分是require('connect-mongo'),它基本上抓取了从connect-mongo npm包返回的任何内容。

在这种情况下,它返回一个函数。你可以这样想:

var connectMongo = function ( expressSession ) {
    // Extends the session object that gets passed in
}

Unlike IIFE's require()调用不会执行该函数,只是返回一个函数供您稍后调用。通过执行require('connect-mongo')(session),您正在运行从require('connect-mongo')返回的方法,并将session传递给它。

在这种情况下,它采用默认的Express会话模块,并返回会话存储(IE是一种将会话数据存储到MongoDB中的方法)。它实际上并没有设置会话密钥(服务器用来签署浏览器的cookie),而只是返回将要使用的会话存储引擎。

让我们继续讨论下一部分。

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

所以有一些事情需要注意。 app.use()是第一个,当您开始使用Express时,这意味着什么并不明显。传入app.use()的方法被认为是middleware,基本上是每个请求都要经过的辅助方法。

如果你看一下,我们将express-session方法传递给中间件,并指定程序should be using the MongoStore as its storage engine.你将数据库选项传递给new MongoStore()方法, connect-mongo实际访问数据库的数据库凭据。

这就是它。发往服务器的每个请求都会有与之关联的会话数据,并使用MongoDB来存储它。如果您想了解有关会话和签名cookie如何工作的更多信息,您应该阅读security.stackexchange上的this question,这是非常有用的信息。