我正在遵循我的SAAS应用程序的教程,这是链接:https://blog.lftechnology.com/designing-a-secure-and-scalable-multi-tenant-application-on-node-js-15ae13dda778
我根据自己的需要更改了应用程序,这就是我正在使用的方法,我的主数据库存储了所有租户及其特定的数据库连接。
当我的用户登录我的应用程序时,angular会存储用户的信息,以了解该用户是哪个数据库。
我有一个名为ConnectionManager的类,该类从用户返回数据库序列对象,这是该类
import Sequelize from 'sequelize';
import db from '../../sequelize.loadModels';
export default class ConnectionManager {
constructor() {
this.model = db;
}
async connectAllDb(slug) {
try {
const tenants = await this.model.sequelize.query(
`
SELECT * FROM tenants WHERE slug = '${slug}'
`,
{ type: this.model.sequelize.QueryTypes.SELECT },
).then(response => response);
const newDb = this.connectionDb(tenants[0]);
return newDb;
} catch (error) {
throw error;
}
}
connectionDb(tenants) {
try {
const options = {
operatorsAliases: false,
dialect: tenants.db_username,
host: tenants.db_host,
logging: false,
};
const databaseConfig = {
db: {
database: tenants.db_name,
user: tenants.db_username,
password: tenants.db_password,
options,
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
},
};
const sequelize = new Sequelize(
databaseConfig.db.database,
databaseConfig.db.user,
databaseConfig.db.password,
databaseConfig.db.options,
databaseConfig.db.pool,
);
return sequelize;
} catch (error) {
throw error;
}
}
}
我在应用程序上为每个服务都有一个控制器,我将展示一些我只是为了测试而设计的控制器功能的一小部分示例
async login(req, res) {
let response;
const userData = req.body.user;
const slugData = req.body.slug;
const newDb = await this.connectionM.connectAllDb(slugData);
const helper = new UserHelper(newDb);
const tenant = await helper.getallUsers();
response = res.status(HTTP_CODES.NOT_FOUND).json({ success: 0, message: 'User finded', Tenant: tenant });
return response;
}
这是我的助手功能
export default class AuthHelper {
constructor(newDb) {
this.model = newDb;
}
async getallUsers() {
try {
const users = await this.model.query(
`
SELECT * FROM pb_users
`,
{ type: this.model.QueryTypes.SELECT },
).then(response => response);
/*
const users = await this.model.user.findOne({
where: {
user_id: 1,
},
logging: console.log,
});*/
return users;
} catch (error) {
throw error;
}
}
}
工作正常,我设法做到了,但是我在考虑性能,这是一个好方法吗?每次用户向服务器发出请求时,我的服务器都会一下连接到主数据库,并从该用户那里提取数据并发出请求,我的应用程序将有20个用户,但是可以扩展,所以每次都有很多连接有问题吗?
我的应用程序中还有一件事情我今天在助手上使用了这种方法
const users = await this.model.query(
`
SELECT * FROM pb_users
`,
{ type: this.model.QueryTypes.SELECT },
).then(response => response);
使用查询生成器,但我不希望自己想要在其他应用程序中使用它,就是这样:
const users = await this.model.user.findOne({
where: {
user_id: 1,
},
logging: console.log,
});
使用模型,如何在不创建表的情况下使用sequelize创建模型?