set up mssql-session-store in node.js

左心房为你撑大大i 提交于 2020-12-05 12:40:13

问题


I'm trying to use mssql-session-store as nodejs (express) store for session: https://www.npmjs.com/package/mssql-session-store

This is how it should be configured(from npm page):

app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
store: new MssqlStore(options) // see options below
}));

var options = {
    connection: existingConnection,
    ttl: 3600,
    reapInterval: 3600,
    reapCallback: function() { console.log('expired sessions were removed); 
   }
};

My problem is with the options.connection. It should be "Optional instance of a Connection from mssql". This connection establishment is an async process (from the npm page):

const sql = require('mssql')
async () => {
try {
    await sql.connect('mssql://username:password@localhost/database')
    const result = await sql.query`select * from mytable where id = 
${value}`
    console.dir(result)
 } catch (err) {
    // ... error checks
 }
}

This is how express session is being defined in the nodejs initialization:

app.use(session({
name:<session name>,
key: <session key id>,
resave:false, 
saveUninitialized:false, 
secure: process.env.NODE_ENV ==="production",  
secret:<secret string>, 
store: new MssqlStore(options), //This is optional - for use when using sql server as a store
cookie:{
        //httpOnly: true, 
        secure: process.env.NODE_ENV ==="production", 
        expires: config.expressSession.cookieLifeTime 
    }
 }));

The problem is that establishment of the connection is an async process. I've tried several versions to both use the express-session in the application, but doing so just after the connection has been set up (async). See my basic code (initialization of node.js - servre.js file):

const express = require('express');
const app = express();
const sql = require('mssql');
const session = require ('express-session'); 
const MssqlStore = require ('mssql-session-store')(session);

var sqlStore = null;
var store = null; 
var mssqlConfig = 
{
  user: <user>
  password: <password>,
  server: <server name>
  database: <database>,     
  options: {
   encrypt: true // Use this if you're on Windows Azure
  }
}

I've tried setting the session in the app in the connetion promise:

var sqlConnection = null;
async function getConnectedConnectionOptions()
{
  try 
  {
      sqlConnection = await sql.connect(<connection string>);
      return await Promise.resolve(sqlconnection: sqlConnection);
  } catch (err) 
  {
      sqlConnection = null;
  }
}

getConnectedConnectionOptions(),then(result => 
     app.use(session({
                    name:<session name>,
                    key: <session key id>,
                    resave:false, 
                    saveUninitialized:false, 
                    secure: process.env.NODE_ENV ==="production",  
                    secret:<secret string>, 
                    store: new MssqlStore(result) , 
                    cookie:{ 
                      //httpOnly: true, 
                        secure: process.env.NODE_ENV ==="production", 
                        expires: config.expressSession.cookieLifeTime 
            }
        }));

but then there's a scope problem where session is not defined in the global app. Please support.

来源:https://stackoverflow.com/questions/56718395/set-up-mssql-session-store-in-node-js

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!