跳到主要内容
版本:4.0.0 🚧

租户

这里介绍如何快速在 Midway 中使用租户组件。

相关信息:

描述
可用于标准项目
可用于 Serverless
可用于一体化
包含独立主框架
包含独立日志

租户定义

租户管理是中后台业务开发过程中经常需要的功能。

在开发中,不同的用户需要保存在不同的数据源、命名空间或是区域中,这些不同的数据区域我们统称为 “租户”。

安装依赖

@midwayjs/tenant 是主要的功能包。

$ npm i @midwayjs/tenant@3 --save

或者在 package.json 中增加如下依赖后,重新安装。

{
"dependencies": {
"@midwayjs/tenant": "^3.0.0",
// ...
}
}

引入组件

首先,引入 组件,在 src/configuration.ts 中导入:

import { Configuration } from '@midwayjs/core';
import * as tenant from '@midwayjs/tenant';

@Configuration({
imports: [
// ...
tenant,
],
})
export class MainConfiguration {
}

租户信息存取

不同的租户数据相互隔离,一般来说,每个用户数据都会关联相关的租户信息,在用户认证拿到用户信息之后,获取其对应的租户数据,以便后续数据读写使用。

在 Midway 中,可以将租户数据保存在请求对象 ctx 中,后续的所有请求作用域对象可以使用。但是租户信息仅仅在请求链路中使用是不够的,需要在不同的作用域都生效,这就需要新的架构来支持。

组件提供了一个 TenantManager 来管理租户信息。

你需要在每个请求链路中保存租户信息,之后才能获取。

租户信息的格式可以按需求定义。

比如:

interface TenantInfo {
id: string;
name: string;
}

比如,在中间件中保存。

import { TenantManager } from '@midwayjs/tenant';
import { Middleware, Inject } from '@midwayjs/core';

@Middleware()
class TenantMiddleware {
@Inject()
tenantManager: TenantManager;

resolve() {
return async(ctx, next) => {
// 请求链路中设置租户信息
await this.tenantManager.setCurrentTenant({
id: '123',
name: '我的租户'
});
}
}
}

在后续的单例服务中获取。

import { TenantManager } from '@midwayjs/tenant';
import { Inject, Singleton } from '@midwayjs/core';
import { TenantInfo } from '../interface';

@Singleton()
class TenantService {
@Inject()
tenantManager: TenantManager;

async getTenantInfo() {
const tenantInfo = await this.tenantManager.getCurrentTenant<TenantInfo>();
if (tenantInfo) {
console.log(tenantInfo.name);
// output => 我的租户
}
}
}
提示
  • 1、租户信息一定会关联请求,如有需求,你可以在不同的 Framework 中都加入中间件
  • 2、每个请求保存的租户信息是隔离的
  • 3、不管是单例还是请求作用域,你都仅能获取到当前请求对应的租户数据