Nodejs 高手指点:如何使用sqlserver保存session?

Nodejs 高手指点:如何使用sqlserver保存session?

查过相关资料redis这样的数据库都有一个模块直接拿来使用,也查过sqlserver保存session相关资料,研究没有成功。不知道具体怎么写,有哪位高手指点一二?公司原来数据就是使用sqlserver。

6 回复

当然可以!以下是如何使用 express-sessiontedious(一个用于 Node.js 的 SQL Server 客户端)来将 Session 数据存储到 SQL Server 的步骤和示例代码。

步骤

  1. 安装必要的依赖
    • express: 用于创建 Web 应用。
    • express-session: 用于管理 session。
    • tedious: 用于与 SQL Server 进行通信。
npm install express express-session tedious
  1. 配置数据库连接: 使用 tedious 连接到 SQL Server 数据库。

  2. 创建 session 存储机制: 创建一个中间件来处理 session 的存储和读取。

  3. 设置 Express 应用: 将上述配置应用到 Express 应用中。

示例代码

1. 创建 sessionStore.js

const { Connection, Request } = require('tedious');
const expressSession = require('express-session');

// 配置数据库连接
const config = {
    server: 'your_server.database.windows.net',
    authentication: {
        type: 'default',
        options: {
            userName: 'your_username',
            password: 'your_password'
        }
    },
    options: {
        database: 'your_database',
        encrypt: true
    }
};

class SqlServerSessionStore extends expressSession.Store {
    constructor() {
        super();
        this.connection = new Connection(config);
        this.connection.on('connect', err => {
            if (err) {
                console.error(err.message);
            } else {
                console.log('Connected to SQL Server');
            }
        });
        this.connection.connect();
    }

    get(sid, callback) {
        const request = new Request(
            `SELECT * FROM sessions WHERE id = @id`,
            (err, rowCount) => {
                if (err) {
                    return callback(err);
                }
                if (rowCount === 0) {
                    return callback(null, null);
                }
                // 假设 session 数据以 JSON 格式存储
                const sessionData = JSON.parse(row[0].data);
                callback(null, sessionData);
            }
        );
        request.addParameter('id', 'VARCHAR(255)', sid);
        this.connection.execSql(request);
    }

    set(sid, session, callback) {
        const request = new Request(
            `INSERT INTO sessions(id, data) VALUES (@id, @data) ON DUPLICATE KEY UPDATE data=@data`,
            (err, rowCount) => {
                if (err) {
                    return callback(err);
                }
                callback(null);
            }
        );
        request.addParameter('id', 'VARCHAR(255)', sid);
        request.addParameter('data', 'VARCHAR(MAX)', JSON.stringify(session));
        this.connection.execSql(request);
    }

    destroy(sid, callback) {
        const request = new Request(
            `DELETE FROM sessions WHERE id = @id`,
            (err, rowCount) => {
                if (err) {
                    return callback(err);
                }
                callback(null);
            }
        );
        request.addParameter('id', 'VARCHAR(255)', sid);
        this.connection.execSql(request);
    }
}

module.exports = SqlServerSessionStore;

2. 在主应用文件中使用 sessionStore.js

const express = require('express');
const session = require('express-session');
const SqlServerSessionStore = require('./sessionStore');

const app = express();

app.use(session({
    store: new SqlServerSessionStore(),
    secret: 'your_secret_key',
    resave: false,
    saveUninitialized: false
}));

app.get('/', (req, res) => {
    req.session.views = (req.session.views || 0) + 1;
    res.send(`You have viewed this page ${req.session.views} times.`);
});

app.listen(3000, () => {
    console.log('App is listening on port 3000');
});

解释

  • SqlServerSessionStore 类:继承自 express-session.Store 并实现了 get, set, destroy 方法。
  • get: 从数据库中获取 session 数据。
  • set: 将 session 数据存储到数据库中。
  • destroy: 删除指定的 session。

通过这种方式,你可以将 session 数据存储在 SQL Server 中,而不需要依赖 Redis 或其他外部存储系统。


应该指的是express的吧…的session 中间件吧…

你可以参考一下mysql 的实现… https://github.com/nlf/connect-mysql

谢谢,有些眉目了。可以使用sqlserver来保存session,跟mysql还是有一定区别,还有些地方需要修改

你就不能用redis吗?

对于大型项目来说肯定不合适,对于一千多人应该没有问题,先学习着用。redis与SQLserver配合着才是王道

要在Node.js中使用SQL Server来保存session,你可以使用express-session库结合session.SqlStore中间件。以下是如何配置的步骤:

  1. 安装必要的依赖包:

    npm install express express-session session-sqlserver
  2. 创建一个连接到SQL Server的配置文件,比如 dbConfig.js

    module.exports = {
        connectionString: 'Server=YOUR_SERVER_NAME;Database=YOUR_DATABASE_NAME;User Id=YOUR_USERNAME;Password=YOUR_PASSWORD;'
    };
  3. 在你的主应用文件中配置session存储:

    const express = require('express');
    const session = require('express-session');
    const SqlSessionStore = require('session-sqlserver')(session);
    const dbConfig = require('./dbConfig');
    
    const app = express();
    
    app.use(session({
        store: new SqlSessionStore(dbConfig),
        secret: 'your_secret_key',
        resave: false,
        saveUninitialized: true,
        cookie: { secure: false } // 如果使用HTTPS,应设置为true
    }));
    
    app.get('/', (req, res) => {
        if (req.session.views) {
            req.session.views++;
            res.setHeader('Content-Type', 'text/html');
            res.write(`<p>Views: ${req.session.views}</p>`);
            res.end();
        } else {
            req.session.views = 1;
            res.end('Welcome to the session demo. Refresh!');
        }
    });
    
    app.listen(3000, () => console.log('Server running on port 3000'));

这段代码创建了一个简单的Express应用,并使用SQL Server作为session存储。每次访问根路由时,它会检查并更新session中的views计数器。

注意:

  • 确保你的SQL Server实例中有一个表用于存储session数据,通常名为[dbo].[Session]
  • 你需要安装SQL Server驱动程序,例如tedious,以便session-sqlserver可以与SQL Server通信。
  • session-sqlserver模块可能需要一些额外的配置或自定义,具体取决于你的环境和需求。

这种方法让你能够将所有session信息存储在SQL Server中,这样可以方便地管理session,并且与现有的SQL Server数据库集成更加紧密。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!