express 配置typeorm-store (15)

131 阅读1分钟

源码: 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 就完事了。