4
4
5
5
var util = require ( 'sails-util' ) ,
6
6
uuid = require ( 'node-uuid' ) ,
7
+ path = require ( 'path' ) ,
7
8
generateSecret = require ( './generateSecret' ) ,
8
9
cookie = require ( 'express/node_modules/cookie' ) ,
9
10
parseSignedCookie = require ( 'express/node_modules/connect' ) . utils . parseSignedCookie ,
@@ -116,6 +117,15 @@ module.exports = function(sails) {
116
117
117
118
sails . config . session . secret = generateSecret ( ) ;
118
119
}
120
+
121
+ // Backwards-compatibility / shorthand notation
122
+ // (allow mongo or redis session stores to be specified directly)
123
+ if ( sails . config . session . adapter === 'redis' ) {
124
+ sails . config . session . adapter = 'connect-redis' ;
125
+ }
126
+ else if ( sails . config . session . adapter === 'mongo' ) {
127
+ sails . config . session . adapter = 'connect-mongo' ;
128
+ }
119
129
} ,
120
130
121
131
/**
@@ -129,42 +139,75 @@ module.exports = function(sails) {
129
139
130
140
// Intepret session adapter config and "new up" a session store
131
141
if ( util . isObject ( sessionConfig ) && ! util . isObject ( sessionConfig . store ) ) {
132
- switch ( sessionConfig . adapter ) {
133
-
134
- // Session explicitly disabled
135
- case null :
136
- // Do nothing...
137
- break ;
138
-
139
- // Supported session adapters
140
- case 'memory' :
141
- sessionConfig . store = new ( require ( 'express' ) . session . MemoryStore ) ( ) ;
142
- break ;
143
- case 'redis' :
144
- try {
145
- sessionConfig . store = new ( require ( 'connect-redis' ) ( require ( 'express' ) ) ) ( sessionConfig ) ;
146
- } catch ( e ) {
147
- return cb ( new Error ( 'Could not load session adapter :: ' + sessionConfig . adapter ) ) ;
148
- }
149
- break ;
150
- case 'mongo' :
151
- try {
152
- sessionConfig . store = new ( require ( 'connect-mongo' ) ( require ( 'express' ) ) ) ( sessionConfig ) ;
153
- } catch ( e ) {
154
- return cb ( new Error ( 'Could not load session adapter :: ' + sessionConfig . adapter ) ) ;
155
- }
156
- break ;
157
142
158
- // Unknown session adapter
159
- default :
160
- // try and load the adapter, catch and throw error
143
+ // Unless the session is explicitly disabled, require the appropriate adapter
144
+ if ( sessionConfig . adapter ) {
145
+
146
+ // 'memory' is a special case
147
+ if ( sessionConfig . adapter === 'memory' ) {
148
+ var MemoryStore = require ( 'express' ) . session . MemoryStore ;
149
+ sessionConfig . store = new MemoryStore ( ) ;
150
+ }
151
+ // Try and load the specified adapter from the local sails project,
152
+ // or catch and return error:
153
+ else {
154
+
155
+ var COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR = function ( adapter , packagejson , e ) {
156
+ var errMsg ;
157
+ if ( e && typeof e === 'object' && e instanceof Error ) {
158
+ errMsg = e . stack ;
159
+ }
160
+ else {
161
+ errMsg = util . inspect ( e ) ;
162
+ }
163
+
164
+ var output = 'Could not load Connect session adapter :: ' + adapter + '\n' ;
165
+ if ( packagejson && ! packagejson . main ) {
166
+ output += '(If this is your module, make sure that the module has a "main" configuration in its package.json file)' ;
167
+ }
168
+ output += '\nError from adapter:\n' + errMsg + '\n\n' ;
169
+
170
+
171
+ // Recommend installation of the session adapter:
172
+ output += 'Do you have the Connect session adapter installed in this project?\n' ;
173
+ output += 'Try running the following command in your project\'s root directory:\n' ;
174
+ var installRecommendation = 'npm install ' ;
175
+ if ( adapter === 'connect-redis' ) {
176
+ installRecommendation += 'connect-redis@1.4.5' ;
177
+ installRecommendation += '\n(Note that `connect-redis@1.5.0` introduced breaking changes- make sure you have v1.4.5 installed!)' ;
178
+ }
179
+ else {
180
+ installRecommendation += adapter ;
181
+ installRecommendation += '\n(Note: Make sure the version of the Connet adapter you install is compatible with Express 3/Sails v0.10)' ;
182
+ }
183
+ installRecommendation += '\n' ;
184
+
185
+ output += installRecommendation ;
186
+
187
+ return output ;
188
+ } ;
189
+
161
190
try {
162
- sessionConfig . store = new ( require ( sessionConfig . adapter ) ( require ( 'express' ) ) ) ( sessionConfig ) ;
163
- break ;
191
+
192
+ // Determine the path to the adapter by using the "main" described in its package.json file:
193
+ var pathToAdapterDependency ;
194
+ var pathToAdapterPackage = path . resolve ( sails . config . appPath , 'node_modules' , sessionConfig . adapter , 'package.json' ) ;
195
+ var adapterPackage ;
196
+ try {
197
+ adapterPackage = require ( pathToAdapterPackage ) ;
198
+ pathToAdapterDependency = path . resolve ( sails . config . appPath , 'node_modules' , sessionConfig . adapter , adapterPackage . main ) ;
199
+ }
200
+ catch ( e ) {
201
+ return cb ( COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR ( sessionConfig . adapter , adapterPackage , e ) ) ;
202
+ }
203
+ var SessionAdapter = require ( pathToAdapterDependency ) ;
204
+ var CustomStore = SessionAdapter ( require ( 'express' ) ) ;
205
+ sessionConfig . store = new CustomStore ( sessionConfig ) ;
164
206
} catch ( e ) {
165
- return cb ( new Error ( 'Could not load session adapter :: ' + sessionConfig . adapter ) ) ;
207
+ // TODO: negotiate error
208
+ return cb ( COULD_NOT_REQUIRE_CONNECT_ADAPTER_ERR ( sessionConfig . adapter , adapterPackage , e ) ) ;
166
209
}
167
-
210
+ }
168
211
}
169
212
}
170
213
0 commit comments