Compare commits
5 Commits
0638111bb5
...
a86d012adc
Author | SHA1 | Date | |
---|---|---|---|
a86d012adc | |||
|
0c5257d06d | ||
|
ff24516a7f | ||
|
2f587c8f1d | ||
|
14e6d6ffee |
44
README.md
44
README.md
@ -24,50 +24,18 @@
|
|||||||
|
|
||||||
## Description
|
## Description
|
||||||
|
|
||||||
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
|
|
||||||
|
|
||||||
## Installation
|
```shell
|
||||||
|
npm i -g @nestjs/cli
|
||||||
```bash
|
|
||||||
$ npm install
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Running the app
|
```shell
|
||||||
|
npm run start:dev
|
||||||
```bash
|
|
||||||
# development
|
|
||||||
$ npm run start
|
|
||||||
|
|
||||||
# watch mode
|
|
||||||
$ npm run start:dev
|
|
||||||
|
|
||||||
# production mode
|
|
||||||
$ npm run start:prod
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Test
|
http://127.0.0.1:3000/api/#/
|
||||||
|
|
||||||
```bash
|
|
||||||
# unit tests
|
|
||||||
$ npm run test
|
|
||||||
|
|
||||||
# e2e tests
|
|
||||||
$ npm run test:e2e
|
|
||||||
|
|
||||||
# test coverage
|
|
||||||
$ npm run test:cov
|
|
||||||
```
|
|
||||||
|
|
||||||
## Support
|

|
||||||
|
|
||||||
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
|
|
||||||
|
|
||||||
## Stay in touch
|
|
||||||
|
|
||||||
- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
|
|
||||||
- Website - [https://nestjs.com](https://nestjs.com/)
|
|
||||||
- Twitter - [@nestframework](https://twitter.com/nestframework)
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Nest is [MIT licensed](LICENSE).
|
|
88
package-lock.json
generated
88
package-lock.json
generated
@ -17,6 +17,8 @@
|
|||||||
"@nestjs/typeorm": "^8.0.3",
|
"@nestjs/typeorm": "^8.0.3",
|
||||||
"hbs": "^4.2.0",
|
"hbs": "^4.2.0",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
|
"nestjs-rate-limiter": "^3.1.0",
|
||||||
|
"nestjs-real-ip": "^2.1.0",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"rxjs": "^7.2.0",
|
"rxjs": "^7.2.0",
|
||||||
@ -1718,6 +1720,11 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/@sqltools/formatter/-/formatter-1.2.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@sqltools/formatter/-/formatter-1.2.3.tgz",
|
||||||
"integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg=="
|
"integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg=="
|
||||||
},
|
},
|
||||||
|
"node_modules/@supercharge/request-ip": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@supercharge/request-ip/-/request-ip-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-wlt6JW69MHqLY2M6Sm/jVyCojNRKq2CBvwH0Hbx24SFhDQQGkgEjeKxVutDxHSyrWixFaOSLXC27euzxijhyMQ=="
|
||||||
|
},
|
||||||
"node_modules/@tootallnate/once": {
|
"node_modules/@tootallnate/once": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
|
||||||
@ -5304,6 +5311,12 @@
|
|||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/is_js": {
|
||||||
|
"version": "0.9.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/is_js/-/is_js-0.9.0.tgz",
|
||||||
|
"integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
"node_modules/is-arrayish": {
|
"node_modules/is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
@ -6927,6 +6940,26 @@
|
|||||||
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/nestjs-rate-limiter": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/nestjs-rate-limiter/-/nestjs-rate-limiter-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-Qwr6daFvNppy038rs0iCQzX/uC3/czCC/2jATcETLIvyFmcBgySOMg7HGEquPKUZDX9lbc06Tn9L6U3QZS13HQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"rate-limiter-flexible": "2.1.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/nestjs-real-ip": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/nestjs-real-ip/-/nestjs-real-ip-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-nq3q1PtrvQ1UffDfE8AWUFTXm70wahTk+v708bdDJTSySi3YUTZ5T0wmFoDDOiiKSc5Phx8n8VW3EaFbtqRpIw==",
|
||||||
|
"dependencies": {
|
||||||
|
"@supercharge/request-ip": "^1.2.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@nestjs/common": "^8.0.0",
|
||||||
|
"request-ip": "^2.1.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/node-emoji": {
|
"node_modules/node-emoji": {
|
||||||
"version": "1.11.0",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz",
|
"resolved": "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz",
|
||||||
@ -7572,6 +7605,11 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/rate-limiter-flexible": {
|
||||||
|
"version": "2.1.10",
|
||||||
|
"resolved": "https://registry.npmmirror.com/rate-limiter-flexible/-/rate-limiter-flexible-2.1.10.tgz",
|
||||||
|
"integrity": "sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw=="
|
||||||
|
},
|
||||||
"node_modules/raw-body": {
|
"node_modules/raw-body": {
|
||||||
"version": "2.5.1",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
|
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
|
||||||
@ -7684,6 +7722,15 @@
|
|||||||
"url": "https://github.com/sponsors/mysticatea"
|
"url": "https://github.com/sponsors/mysticatea"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/request-ip": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/request-ip/-/request-ip-2.1.3.tgz",
|
||||||
|
"integrity": "sha512-J3qdE/IhVM3BXkwMIVO4yFrvhJlU3H7JH16+6yHucadT4fePnR8dyh+vEs6FIx0S2x5TCt2ptiPfHcn0sqhbYQ==",
|
||||||
|
"peer": true,
|
||||||
|
"dependencies": {
|
||||||
|
"is_js": "^0.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/require-directory": {
|
"node_modules/require-directory": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
@ -10770,6 +10817,11 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/@sqltools/formatter/-/formatter-1.2.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@sqltools/formatter/-/formatter-1.2.3.tgz",
|
||||||
"integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg=="
|
"integrity": "sha512-O3uyB/JbkAEMZaP3YqyHH7TMnex7tWyCbCI4EfJdOCoN6HIhqdJBWTM6aCCiWQ/5f5wxjgU735QAIpJbjDvmzg=="
|
||||||
},
|
},
|
||||||
|
"@supercharge/request-ip": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@supercharge/request-ip/-/request-ip-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-wlt6JW69MHqLY2M6Sm/jVyCojNRKq2CBvwH0Hbx24SFhDQQGkgEjeKxVutDxHSyrWixFaOSLXC27euzxijhyMQ=="
|
||||||
|
},
|
||||||
"@tootallnate/once": {
|
"@tootallnate/once": {
|
||||||
"version": "1.1.2",
|
"version": "1.1.2",
|
||||||
"resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
|
"resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-1.1.2.tgz",
|
||||||
@ -13343,6 +13395,12 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
"resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
|
||||||
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
|
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
|
||||||
},
|
},
|
||||||
|
"is_js": {
|
||||||
|
"version": "0.9.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/is_js/-/is_js-0.9.0.tgz",
|
||||||
|
"integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==",
|
||||||
|
"peer": true
|
||||||
|
},
|
||||||
"is-arrayish": {
|
"is-arrayish": {
|
||||||
"version": "0.2.1",
|
"version": "0.2.1",
|
||||||
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
"resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz",
|
||||||
@ -14557,6 +14615,22 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
|
"resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz",
|
||||||
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
|
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
|
||||||
},
|
},
|
||||||
|
"nestjs-rate-limiter": {
|
||||||
|
"version": "3.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/nestjs-rate-limiter/-/nestjs-rate-limiter-3.1.0.tgz",
|
||||||
|
"integrity": "sha512-Qwr6daFvNppy038rs0iCQzX/uC3/czCC/2jATcETLIvyFmcBgySOMg7HGEquPKUZDX9lbc06Tn9L6U3QZS13HQ==",
|
||||||
|
"requires": {
|
||||||
|
"rate-limiter-flexible": "2.1.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nestjs-real-ip": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/nestjs-real-ip/-/nestjs-real-ip-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-nq3q1PtrvQ1UffDfE8AWUFTXm70wahTk+v708bdDJTSySi3YUTZ5T0wmFoDDOiiKSc5Phx8n8VW3EaFbtqRpIw==",
|
||||||
|
"requires": {
|
||||||
|
"@supercharge/request-ip": "^1.2.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node-emoji": {
|
"node-emoji": {
|
||||||
"version": "1.11.0",
|
"version": "1.11.0",
|
||||||
"resolved": "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz",
|
"resolved": "https://registry.npmmirror.com/node-emoji/-/node-emoji-1.11.0.tgz",
|
||||||
@ -14987,6 +15061,11 @@
|
|||||||
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
|
"resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz",
|
||||||
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
|
||||||
},
|
},
|
||||||
|
"rate-limiter-flexible": {
|
||||||
|
"version": "2.1.10",
|
||||||
|
"resolved": "https://registry.npmmirror.com/rate-limiter-flexible/-/rate-limiter-flexible-2.1.10.tgz",
|
||||||
|
"integrity": "sha512-Pa+8TPD4xYaiCUB5K4a/+j2FHDUe4HP1g49JmKEmkOkhqPaeVqxJsZuuVaza/svSCOT+V73vtsyBiSFK/e1yXw=="
|
||||||
|
},
|
||||||
"raw-body": {
|
"raw-body": {
|
||||||
"version": "2.5.1",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
|
"resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.1.tgz",
|
||||||
@ -15068,6 +15147,15 @@
|
|||||||
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
|
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"request-ip": {
|
||||||
|
"version": "2.1.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/request-ip/-/request-ip-2.1.3.tgz",
|
||||||
|
"integrity": "sha512-J3qdE/IhVM3BXkwMIVO4yFrvhJlU3H7JH16+6yHucadT4fePnR8dyh+vEs6FIx0S2x5TCt2ptiPfHcn0sqhbYQ==",
|
||||||
|
"peer": true,
|
||||||
|
"requires": {
|
||||||
|
"is_js": "^0.9.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"require-directory": {
|
"require-directory": {
|
||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
|
"resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
|
@ -29,6 +29,8 @@
|
|||||||
"@nestjs/typeorm": "^8.0.3",
|
"@nestjs/typeorm": "^8.0.3",
|
||||||
"hbs": "^4.2.0",
|
"hbs": "^4.2.0",
|
||||||
"mysql2": "^2.3.3",
|
"mysql2": "^2.3.3",
|
||||||
|
"nestjs-rate-limiter": "^3.1.0",
|
||||||
|
"nestjs-real-ip": "^2.1.0",
|
||||||
"reflect-metadata": "^0.1.13",
|
"reflect-metadata": "^0.1.13",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"rxjs": "^7.2.0",
|
"rxjs": "^7.2.0",
|
||||||
|
17
src/aaa/aaa.controller.spec.ts
Normal file
17
src/aaa/aaa.controller.spec.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
import { Test, TestingModule } from '@nestjs/testing';
|
||||||
|
|
||||||
|
describe('AaaController', () => {
|
||||||
|
let controller: AaaController;
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
|
const module: TestingModule = await Test.createTestingModule({
|
||||||
|
controllers: [AaaController],
|
||||||
|
}).compile();
|
||||||
|
|
||||||
|
controller = module.get<AaaController>(AaaController);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be defined', () => {
|
||||||
|
expect(controller).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
@ -14,8 +14,10 @@ import {
|
|||||||
import { AppService } from './app.service';
|
import { AppService } from './app.service';
|
||||||
import { Request } from 'express';
|
import { Request } from 'express';
|
||||||
import { ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
|
import { ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||||
|
import { RealIP } from 'nestjs-real-ip';
|
||||||
|
|
||||||
@Controller()
|
@Controller()
|
||||||
|
@ApiTags('基本使用')
|
||||||
export class AppController {
|
export class AppController {
|
||||||
// constructor(private readonly appService: AppService) {}
|
// constructor(private readonly appService: AppService) {}
|
||||||
|
|
||||||
@ -24,6 +26,20 @@ export class AppController {
|
|||||||
// return this.appService.getHello();
|
// return this.appService.getHello();
|
||||||
// }
|
// }
|
||||||
// 基础路由
|
// 基础路由
|
||||||
|
|
||||||
|
@Get('/getip')
|
||||||
|
@ApiTags('获取访问者IP')
|
||||||
|
getIP(@RealIP() ip: string): string {
|
||||||
|
// npm i nestjs-real-ip
|
||||||
|
return ip;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
@Redirect('/api', 302)
|
||||||
|
hello() {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
@Get('/r1')
|
@Get('/r1')
|
||||||
@HttpCode(200)
|
@HttpCode(200)
|
||||||
getR1(): string {
|
getR1(): string {
|
||||||
|
@ -3,9 +3,19 @@ import { AppController } from './app.controller';
|
|||||||
import { AppService } from './app.service';
|
import { AppService } from './app.service';
|
||||||
import { ScheduleModule } from '@nestjs/schedule';
|
import { ScheduleModule } from '@nestjs/schedule';
|
||||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
import { RateLimiterModule } from 'nestjs-rate-limiter';
|
||||||
|
|
||||||
import User from './entity/user';
|
import User from './entity/user';
|
||||||
|
import { TechModule } from './apps/tech';
|
||||||
|
import { CatsModule } from './apps/tech/cats/cats.module';
|
||||||
|
import { RateModule } from './apps/rate';
|
||||||
|
import { UseControllerModule } from './apps/useController';
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
|
TechModule,
|
||||||
|
RateModule,
|
||||||
|
RateLimiterModule,
|
||||||
|
UseControllerModule,
|
||||||
ScheduleModule.forRoot(),
|
ScheduleModule.forRoot(),
|
||||||
TypeOrmModule.forRoot({
|
TypeOrmModule.forRoot({
|
||||||
type: 'mysql',
|
type: 'mysql',
|
||||||
@ -15,8 +25,11 @@ import User from './entity/user';
|
|||||||
password: 'ne5BbDCiYwx3n6nE',
|
password: 'ne5BbDCiYwx3n6nE',
|
||||||
database: 'nest_test',
|
database: 'nest_test',
|
||||||
entities: [User],
|
entities: [User],
|
||||||
synchronize: true,
|
synchronize: true, // 是否开启同步
|
||||||
|
autoLoadEntities: true, // 是否自动导入
|
||||||
|
logging: false, // 打印日志
|
||||||
}),
|
}),
|
||||||
|
CatsModule,
|
||||||
],
|
],
|
||||||
controllers: [AppController],
|
controllers: [AppController],
|
||||||
providers: [AppService],
|
providers: [AppService],
|
||||||
|
18
src/apps/rate/controller.ts
Normal file
18
src/apps/rate/controller.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { Controller, Get } from '@nestjs/common';
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { RateLimit } from 'nestjs-rate-limiter';
|
||||||
|
|
||||||
|
@Controller('rate')
|
||||||
|
@ApiTags('Rate频率限制')
|
||||||
|
export default class RateController {
|
||||||
|
@Get('/t1')
|
||||||
|
@RateLimit({
|
||||||
|
keyPrefix: 'sign-up',
|
||||||
|
points: 1,
|
||||||
|
duration: 1,
|
||||||
|
errorMessage: '系统忙',
|
||||||
|
})
|
||||||
|
T1() {
|
||||||
|
return '频率限制T1';
|
||||||
|
}
|
||||||
|
}
|
8
src/apps/rate/index.ts
Normal file
8
src/apps/rate/index.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// npm i nestjs-rate-limiter
|
||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import RateController from './controller';
|
||||||
|
@Module({
|
||||||
|
controllers: [RateController],
|
||||||
|
providers: [],
|
||||||
|
})
|
||||||
|
export class RateModule {}
|
4
src/apps/tech/cats/cats.module.ts
Normal file
4
src/apps/tech/cats/cats.module.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
|
||||||
|
@Module({})
|
||||||
|
export class CatsModule {}
|
22
src/apps/tech/controller/tech.ts
Normal file
22
src/apps/tech/controller/tech.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import { Controller, Get } from '@nestjs/common';
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
import { InjectRepository } from '@nestjs/typeorm';
|
||||||
|
import { Repository } from 'typeorm';
|
||||||
|
import TechEntity from '../entity/tech';
|
||||||
|
@Controller('/tech')
|
||||||
|
@ApiTags('ORM使用')
|
||||||
|
export default class TechController {
|
||||||
|
@InjectRepository(TechEntity)
|
||||||
|
private tech: Repository<TechEntity>;
|
||||||
|
|
||||||
|
@Get('/t1')
|
||||||
|
getT1() {
|
||||||
|
return 'T1';
|
||||||
|
}
|
||||||
|
/// 数据库查询 裙查询
|
||||||
|
@Get('/t2')
|
||||||
|
async getT2() {
|
||||||
|
const techs = await this.tech.find();
|
||||||
|
return techs;
|
||||||
|
}
|
||||||
|
}
|
10
src/apps/tech/entity/tech.ts
Normal file
10
src/apps/tech/entity/tech.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';
|
||||||
|
|
||||||
|
@Entity()
|
||||||
|
export default class Tech {
|
||||||
|
@PrimaryGeneratedColumn()
|
||||||
|
id: number;
|
||||||
|
|
||||||
|
@Column()
|
||||||
|
name: string;
|
||||||
|
}
|
10
src/apps/tech/index.ts
Normal file
10
src/apps/tech/index.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||||
|
import Tech from './entity/tech';
|
||||||
|
import TechController from './controller/tech';
|
||||||
|
@Module({
|
||||||
|
imports: [TypeOrmModule.forFeature([Tech])], // 此模块使用 forFeature() 方法定义在当前范围中注册哪些存储库。这样,我们就可以使用 @InjectRepository()装饰器将 UsersRepository 注入到 UsersService 中:
|
||||||
|
controllers: [TechController],
|
||||||
|
providers: [],
|
||||||
|
})
|
||||||
|
export class TechModule {}
|
8
src/apps/useController/index.ts
Normal file
8
src/apps/useController/index.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import { Module } from '@nestjs/common';
|
||||||
|
import ParamController from './param';
|
||||||
|
@Module({
|
||||||
|
imports: [],
|
||||||
|
controllers: [ParamController],
|
||||||
|
providers: [],
|
||||||
|
})
|
||||||
|
export class UseControllerModule {}
|
12
src/apps/useController/param.ts
Normal file
12
src/apps/useController/param.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import { Controller, Get } from '@nestjs/common';
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@Controller('/useController/param')
|
||||||
|
@ApiTags('Controller使用')
|
||||||
|
export default class ParamController {
|
||||||
|
// 基本控制器
|
||||||
|
@Get('/t1')
|
||||||
|
getT1() {
|
||||||
|
return 'T1';
|
||||||
|
}
|
||||||
|
}
|
@ -1,24 +0,0 @@
|
|||||||
import { Test, TestingModule } from '@nestjs/testing';
|
|
||||||
import { INestApplication } from '@nestjs/common';
|
|
||||||
import * as request from 'supertest';
|
|
||||||
import { AppModule } from './../src/app.module';
|
|
||||||
|
|
||||||
describe('AppController (e2e)', () => {
|
|
||||||
let app: INestApplication;
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
const moduleFixture: TestingModule = await Test.createTestingModule({
|
|
||||||
imports: [AppModule],
|
|
||||||
}).compile();
|
|
||||||
|
|
||||||
app = moduleFixture.createNestApplication();
|
|
||||||
await app.init();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('/ (GET)', () => {
|
|
||||||
return request(app.getHttpServer())
|
|
||||||
.get('/')
|
|
||||||
.expect(200)
|
|
||||||
.expect('Hello World!');
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,9 +0,0 @@
|
|||||||
{
|
|
||||||
"moduleFileExtensions": ["js", "json", "ts"],
|
|
||||||
"rootDir": ".",
|
|
||||||
"testEnvironment": "node",
|
|
||||||
"testRegex": ".e2e-spec.ts$",
|
|
||||||
"transform": {
|
|
||||||
"^.+\\.(t|j)s$": "ts-jest"
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user