源码: j-spring-eco ts版本的Spring全家桶,开发阶段。
前言
这是一个复合插件,需要web和jpa的包支持。所以单独建一个项目【j-spring-typeorm-session】
依赖:
"express-session": "^1.17.3",
"reflect-metadata": "^0.1.13",
"typeorm": "^0.3.10",
"typeorm-store": "^2.0.1",
"j-spring": "file:.yalc/j-spring",
"j-spring-jpa": "file:.yalc/j-spring-jpa",
"j-spring-type-wrap": "file:.yalc/j-spring-type-wrap",
"j-spring-web": "file:.yalc/j-spring-web"
spring 封装 typeorm-store
-
ExpressSessioin 直接复制typeorm-store在npm.io上面的文档
-
Component 修饰器保证属性dataSource、secret 、maxAge的自动注入 。
-
ExpressConfiguration 接口保证了express实例化后,调用load方法,进行typeorm-store的配置。
-
springBean接口保证了,该类在实例化的时候向type-orm注册ExpressSessioin表模型。
import { Autowired, Component, SpringBean, Value } from 'j-spring';
import { ExpressConfiguration, ExpressApp } from 'j-spring-web';
import { BaseEntity, Column, DataSource, Entity, PrimaryColumn } from 'typeorm';
import { SessionEntity, TypeormStore } from 'typeorm-store';
import { loadEntity } from 'j-spring-jpa';
import session from 'express-session';
@Entity()
class ExpressSessioin extends BaseEntity implements SessionEntity {
@PrimaryColumn()
id: string;
@Column()
expiresAt: number;
@Column()
data: string;
}
@Component()
export class JSpringTypeOrmSession implements ExpressConfiguration, SpringBean {
@Autowired()
dataSource: DataSource;
@Value({
path: 'express.session.secret',
force: false,
remark: 'session密钥',
})
secret: string = 'kity';
@Value({
path: 'express.session.maxAge',
force: false,
remark: '有效时间,默认1h',
})
maxAge: number = 1000 * 60 * 60;
onBeanInit(): void {
loadEntity([ExpressSessioin]);
}
onAttrMounted(): void {}
load(app: ExpressApp): void {
const repository = this.dataSource.getRepository(ExpressSessioin);
app.use(
session({
secret: this.secret,
resave: false,
saveUninitialized: false,
store: new TypeormStore({ repository }),
cookie: {
maxAge: this.maxAge,
},
})
);
}
isExpressConfiguration(): boolean {
return true;
}
isSpringBean(): boolean {
return true;
}
}
随后写个测试用例
import { spring } from 'j-spring';
import { sqliteModule } from 'j-spring-jpa';
import {
ApiRemark,
Controller,
Get,
Param,
Session,
SessionAttribute,
springWebModule,
} from 'j-spring-web';
import { JSpringTypeOrmSession } from '../src';
@Controller('testSession')
class TestSessionController {
@ApiRemark('测试session装配')
@Get()
async toTestSeesion(
@Param() session: Session,
@SessionAttribute('user', false) user: string
) {
if (user === void 0) session.set('user', 'user is set!');
return { msg: 'request ok', user };
}
}
spring
.bindModule([
sqliteModule,//sqlite的typeorm配置包
springWebModule,//express的web配置包
[JSpringTypeOrmSession, TestSessionController],//添加typeorm-store配置 和 一个访问控制器
])
.invokeStarter();
- 逻辑比较简单,就不写复杂的单测了。浏览器访问http:localhost/testSession/toTestSeesion 就完事了。