chill117 / express-mysql-session

A MySQL session store for the express framework in node
MIT License
313 stars 106 forks source link

Cannot set property 'connection' of undefined when using import instead of require #114

Closed Akxe closed 3 years ago

Akxe commented 3 years ago

I have installed this package and followed steps, yet I am getting as an error. I am not sure why (and how!?) would this be undefined, but it seems like it...

import { config } from 'dotenv';
import { join } from 'path';
config({ path: join(__dirname, '../../../prisma/.env') });

import type { Express } from 'express';
import MySQLStore from 'express-mysql-session';
import session from 'express-session';

const parsed = new URL(process.env.DATABASE_URL!);
export default (app: Express) => {
    app.use(session({
        key: 'session_cookie_name',
        secret: 'session_cookie_secret',
        store: new MySQLStore(session)({
            host: parsed.hostname,
            port: parsed.port,
            user: parsed.username,
            password: parsed.password,
            database: 'session',
        }),
        resave: false,
        saveUninitialized: false,
        unset: 'destroy',
    }));
    return app;
};

Error:

C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\node_modules\express-mysql-session\index.js:33
                this.connection = connection;
^
TypeError: Cannot set property 'connection' of undefined
    at MySQLStore (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\node_modules\express-mysql-session\index.js:33:1)
    at ./apps/server/src/mail-adapter/session.ts.__webpack_exports__.default (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\apps\server\src\mail-adapter\session.ts:14:35)
    at Module../apps/server/src/main.ts (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\apps\server\src\main.ts:16:13)
    at __webpack_require__ (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\webpack\bootstrap:19:1)
    at Object.0 (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\main.js:17004:18)
    at __webpack_require__ (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\webpack\bootstrap:19:1)
    at C:\Users\akxe\Documents\Programming\rita\dist\apps\server\webpack:\webpack\bootstrap:83:1
    at Object.<anonymous> (C:\Users\akxe\Documents\Programming\rita\dist\apps\server\main.js:87:10)
    at Module._compile (internal/modules/cjs/loader.js:1200:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1220:10)
chill117 commented 3 years ago

Usage as follows (from the docs):

var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);

var options = {
    host: 'localhost',
    port: 3306,
    user: 'session_test',
    password: 'password',
    database: 'session_test'
};

var sessionStore = new MySQLStore(options);

app.use(session({
    key: 'session_cookie_name',
    secret: 'session_cookie_secret',
    store: sessionStore,
    resave: false,
    saveUninitialized: false
}));

So to translate this to the syntax you're using:

import type { Express } from 'express';
import session from 'express-session';
import MySQLSession from 'express-mysql-session';
const MySQLStore = MySQLSession(session);

const parsed = new URL(process.env.DATABASE_URL!);

export default (app: Express) => {
    app.use(session({
        key: 'session_cookie_name',
        secret: 'session_cookie_secret',
        store: new MySQLStore({
            host: parsed.hostname,
            port: parsed.port,
            user: parsed.username,
            password: parsed.password,
            database: 'session',
        }),
        resave: false,
        saveUninitialized: false,
        unset: 'destroy',
    }));
    return app;
};
chill117 commented 3 years ago

Closing this as it is likely resolved.