Nodejs 高手指点:如何使用sqlserver保存session?
Nodejs 高手指点:如何使用sqlserver保存session?
查过相关资料redis这样的数据库都有一个模块直接拿来使用,也查过sqlserver保存session相关资料,研究没有成功。不知道具体怎么写,有哪位高手指点一二?公司原来数据就是使用sqlserver。
6 回复
当然可以!以下是如何使用 express-session
和 tedious
(一个用于 Node.js 的 SQL Server 客户端)来将 Session 数据存储到 SQL Server 的步骤和示例代码。
步骤
- 安装必要的依赖:
express
: 用于创建 Web 应用。express-session
: 用于管理 session。tedious
: 用于与 SQL Server 进行通信。
npm install express express-session tedious
-
配置数据库连接: 使用
tedious
连接到 SQL Server 数据库。 -
创建 session 存储机制: 创建一个中间件来处理 session 的存储和读取。
-
设置 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配合着才是王道