过去几周我一直在积极学习JS / MEAN堆栈,但我错过了我们对(session)
所做的事情。我们是从var session = require('express-session');
添加对象还是添加了什么??
感谢您的任何澄清。
答案 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,这是非常有用的信息。