koa-passport-example icon indicating copy to clipboard operation
koa-passport-example copied to clipboard

Incompatible with koa-mount - TypeError: Cannot read property 'store' of undefined at session

Open koheiio opened this issue 6 years ago • 3 comments

I'm working with koa-mount, looks like the problem is koa-session but I'm completely lost with this implementation with koa-passport. My code is like : server.js:

'use strict';

const koa = require("koa");
const application = require('./application.js')
const app = new koa();
const appPort = 3000;

// Mount application
const mount = require('koa-mount');
app.use(mount('/application', application));

// serve index.html
const serve = require('koa-static-server');
app.use(serve({rootDir: __dirname+'/test', rootPath: '/'}));

// init server
app.listen(appPort, function() {
	console.log(`Ready at port: ${appPort}`)
});

application.js:

// use strict code
"use strict";

const fs = require('fs');

// appFactory
const appFactory = () => {
	const Koa = require('koa')
	const app = new Koa()
	const serve = require('koa-static-server')
	const router = require('koa-router')();
	const session = require('koa-session')
	const bodyParser = require('koa-bodyparser')
	const passport = require('koa-passport')

	// trust proxy
	app.proxy = true

	// session
	app.keys = ['your-session-secret']
	app.use(session({}, app)) // <-- _problem occurs here_

	// body parser
	app.use(bodyParser())

	// passport
	require('./auth')
	app.use(passport.initialize())
	app.use(passport.session())

	// post login
	router.post('/login', passport.authenticate('local', {
		successRedirect: '/',
		failureRedirect: '/eos/'
	}));

	// post logout
	router.get('/logout', function(ctx) {
		if (ctx.isAuthenticated()) {
			ctx.logout()
		}
		ctx.redirect('/')
	});

	// admin route
	router.get('/', async(ctx) => {
		ctx.type = 'html'
		if (ctx.isAuthenticated()) {
			ctx.body = fs.createReadStream('views/log-out.html')
		} else {
			ctx.body = fs.createReadStream('views/log-in.html')
		}
	});

	// post update
	router.post('/', async(ctx, next) => {
		if (ctx.isAuthenticated()) {
			// Attach db to context
			ctx.langDB = db
			for (var keypath in ctx.request.body) {
				const content = ctx.request.body[keypath]
				// Frontend EOS has to convert . to / to avoid being broken up by bodyparser
				keypath = keypath.replace(/\//g, '.')
				ctx.langDB.set(keypath, content).write()
			}
			ctx.status = 200
		} else {
			ctx.status = 401
		}
	});

	// sample route
	router.get('/sample.js', async(ctx) => {
		ctx.type = 'application/json'
		if (ctx.isAuthenticated()) {
			ctx.body = fs.createReadStream('views/sample.js')
		} else {
			ctx.body = fs.createReadStream('views/sample-blank.js')
		}
	});

	// use routes
	app.use(router.routes()).use(router.allowedMethods());

	// serve public
	app.use(serve({
		rootDir: __dirname + '/public',
		rootPath: '/'
	}));
	return app
}

// export module
module.exports = () => {
	return appFactory()
}

the error I'm getting is

TypeError: Cannot read property 'store' of undefined
      at session (/Users/sysuser/Desktop/eos/node_modules/koa-session/index.js:41:13)
      at dispatch (/Users/sysuser/Desktop/eos/node_modules/koa-mount/node_modules/koa-compose/index.js:44:32)
      at /Users/sysuser/Desktop/eos/node_modules/koa-mount/node_modules/koa-compose/index.js:36:12
      at /Users/sysuser/Desktop/eos/node_modules/koa-mount/index.js:58:11
      at dispatch (/Users/sysuser/Desktop/eos/node_modules/koa-compose/index.js:42:32)
      at /Users/sysuser/Desktop/eos/node_modules/koa-compose/index.js:34:12
      at Server.handleRequest (/Users/sysuser/Desktop/eos/node_modules/koa/lib/application.js:136:14)
      at emitTwo (events.js:106:13)
      at Server.emit (events.js:194:7)
      at parserOnIncoming (_http_server.js:563:12)

I've tried using your package.json as a base - still the same. it doesn't matter what router module i use - it breaks at app.use(session({}, app)) - Any suggestions?

koheiio avatar Oct 13 '17 20:10 koheiio