Я пытаюсь использовать mssql-session-store как nodejs (express) store для сессии:
https://www.npmjs.com/package/mssql-session-store
Вот как это должно быть настроено (со страницы npm):
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);
}
};
Моя проблема связана с options.connection. Это должен быть «Необязательный экземпляр подключения из mssql».
Это установление соединения является асинхронным процессом (со страницы npm):
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
}
}
Вот как определяется экспресс-сеанс при инициализации nodejs:
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
}
}));
Проблема в том, что установление соединения является асинхронным процессом. Я пробовал несколько версий, чтобы использовать экспресс-сессию в приложении, но делал это сразу после того, как соединение было установлено (асинхронно).
Смотрите мой основной код (инициализация файла node.js - servre.js):
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
}
}
Я попытался установить сеанс в приложении в обещании подключения:
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
}
}));
но возникает проблема с областью, когда сессия не определяется в глобальном приложении.
Пожалуйста, поддержите.