فهرست منبع

Add mysql, fortunes to NestJS, speed up update test. (#5078)

* Add mysql test to NestJS

* Add fortunes benchmark to NestJS

* cleanup and simplify query and update handlers for NestJS
Svetlozar Argirov 5 سال پیش
والد
کامیت
743f18afcf

+ 19 - 0
frameworks/TypeScript/nest/benchmark_config.json

@@ -7,6 +7,7 @@
       "update_url": "/bench/updates?queries=",
       "update_url": "/bench/updates?queries=",
       "query_url": "/bench/queries?queries=",
       "query_url": "/bench/queries?queries=",
       "db_url": "/bench/db",
       "db_url": "/bench/db",
+      "fortune_url": "/bench/fortunes",
       "port": 8080,
       "port": 8080,
       "approach": "Realistic",
       "approach": "Realistic",
       "classification": "Micro",
       "classification": "Micro",
@@ -18,6 +19,24 @@
       "database_os": "Linux",
       "database_os": "Linux",
       "display_name": "nestjs",
       "display_name": "nestjs",
       "versus": "nodejs"
       "versus": "nodejs"
+    },
+    "mysql": {
+      "json_url": "/bench/json",
+      "plaintext_url": "/bench/plaintext",
+      "update_url": "/bench/updates?queries=",
+      "query_url": "/bench/queries?queries=",
+      "db_url": "/bench/db",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "framework": "nestjs",
+      "language": "TypeScript",
+      "os": "Linux",
+      "orm": "Full",
+      "database": "MySQL",
+      "database_os": "Linux",
+      "display_name": "nestjs",
+      "versus": "nodejs"
     }
     }
   }]
   }]
 }
 }

+ 10 - 0
frameworks/TypeScript/nest/nestjs-mysql.dockerfile

@@ -0,0 +1,10 @@
+FROM node:12.3.1-slim
+
+COPY ./ ./
+
+RUN yarn install
+
+ENV NODE_ENV production
+ENV DATABASE_CONFIGURATION_PROFILE=mysql
+
+CMD ["yarn", "start:prod"]

+ 1 - 0
frameworks/TypeScript/nest/nestjs.dockerfile

@@ -5,5 +5,6 @@ COPY ./ ./
 RUN yarn install
 RUN yarn install
 
 
 ENV NODE_ENV production
 ENV NODE_ENV production
+ENV DATABASE_CONFIGURATION_PROFILE=postgres
 
 
 CMD ["yarn", "start:prod"]
 CMD ["yarn", "start:prod"]

+ 30 - 8
frameworks/TypeScript/nest/ormconfig.js

@@ -1,11 +1,33 @@
-module.exports = {
-    "type": "postgres",
-    "host": "tfb-database",
-    "port": 5432,
-    "username": "benchmarkdbuser",
-    "password": "benchmarkdbpass",
-    "database": "hello_world",
+let config = {
     "synchronize":false,
     "synchronize":false,
     "logging": false,
     "logging": false,
     "entities": process.env.NODE_ENV === 'production' ? ["./dist/**/*.entity.js"] : ["./dist/**/*.entity.js", "./src/**/*.entity.ts"]
     "entities": process.env.NODE_ENV === 'production' ? ["./dist/**/*.entity.js"] : ["./dist/**/*.entity.js", "./src/**/*.entity.ts"]
-}
+}
+
+switch(process.env.DATABASE_CONFIGURATION_PROFILE) {
+    case 'mysql':
+        config = {
+            ...config,
+            "type": "mysql",
+            "host": "tfb-database",
+            "port": 3306,
+            "username": "benchmarkdbuser",
+            "password": "benchmarkdbpass",
+            "database": "hello_world",
+        }
+        break;
+    case 'postgres':
+    default:
+        config = {
+            ...config,
+            "type": "postgres",
+            "host": "tfb-database",
+            "port": 5432,
+            "username": "benchmarkdbuser",
+            "password": "benchmarkdbpass",
+            "database": "hello_world",
+        }
+        break;
+}
+
+module.exports = config

+ 3 - 1
frameworks/TypeScript/nest/package.json

@@ -9,7 +9,7 @@
     "start": "ts-node -r tsconfig-paths/register src/main.ts",
     "start": "ts-node -r tsconfig-paths/register src/main.ts",
     "start:dev": "nodemon",
     "start:dev": "nodemon",
     "start:debug": "nodemon --config nodemon-debug.json",
     "start:debug": "nodemon --config nodemon-debug.json",
-    "prestart:prod": "rm -rf dist && tsc",
+    "prestart:prod": "rm -rf dist && tsc && cp -r src/views/ dist/",
     "start:prod": "node dist/main.js"
     "start:prod": "node dist/main.js"
   },
   },
   "dependencies": {
   "dependencies": {
@@ -21,6 +21,8 @@
     "express-cluster": "^0.0.5",
     "express-cluster": "^0.0.5",
     "fastify": "2.8.0",
     "fastify": "2.8.0",
     "fastify-formbody": "3.1.0",
     "fastify-formbody": "3.1.0",
+    "hbs": "^4.0.4",
+    "mysql2": "^1.7.0",
     "pg": "7.12.1",
     "pg": "7.12.1",
     "reflect-metadata": "0.1.13",
     "reflect-metadata": "0.1.13",
     "rxjs": "6.5.3",
     "rxjs": "6.5.3",

+ 12 - 1
frameworks/TypeScript/nest/src/bench/bench.controller.ts

@@ -1,4 +1,5 @@
-import { Controller, Get, Header, Query } from '@nestjs/common';
+import { Controller, Get, Header, Query, Res, Render } from '@nestjs/common';
+import { Response } from 'express';
 
 
 import { BenchService } from './bench.service';
 import { BenchService } from './bench.service';
 
 
@@ -42,4 +43,14 @@ export class BenchController {
 
 
         return 'Hello, World!';
         return 'Hello, World!';
     }
     }
+
+    @Get('/fortunes')
+    @Render('fortunes')
+    @Header('Server', 'NestJS')
+    fortunes(@Res() res: Response) {
+        return this.benchService.getFortunes().then( fortunes => ({
+            fortunes,
+        }));
+    }
+
 }
 }

+ 2 - 2
frameworks/TypeScript/nest/src/bench/bench.module.ts

@@ -4,10 +4,10 @@ import { TypeOrmModule } from '@nestjs/typeorm';
 import { BenchController } from './bench.controller';
 import { BenchController } from './bench.controller';
 import { BenchService } from './bench.service';
 import { BenchService } from './bench.service';
 import { WorldEntity } from './../models/world.entity';
 import { WorldEntity } from './../models/world.entity';
-// import { FortuneEntity } from './../models/fortune.entity';
+import { FortuneEntity } from './../models/fortune.entity';
 
 
 @Module({
 @Module({
-  imports: [TypeOrmModule.forFeature([WorldEntity])],
+  imports: [TypeOrmModule.forFeature([WorldEntity, FortuneEntity])],
   controllers: [BenchController],
   controllers: [BenchController],
   providers: [BenchService],
   providers: [BenchService],
   exports: [BenchService],
   exports: [BenchService],

+ 28 - 19
frameworks/TypeScript/nest/src/bench/bench.service.ts

@@ -1,13 +1,17 @@
 import { Injectable } from '@nestjs/common';
 import { Injectable } from '@nestjs/common';
 import { Repository } from 'typeorm';
 import { Repository } from 'typeorm';
 import { WorldEntity } from '../models/world.entity';
 import { WorldEntity } from '../models/world.entity';
+import { FortuneEntity } from '../models/fortune.entity';
 import { InjectRepository } from '@nestjs/typeorm';
 import { InjectRepository } from '@nestjs/typeorm';
 
 
 @Injectable()
 @Injectable()
 export class BenchService {
 export class BenchService {
     constructor(
     constructor(
         @InjectRepository(WorldEntity)
         @InjectRepository(WorldEntity)
-        private worldRepository: Repository<WorldEntity>){}
+        private worldRepository: Repository<WorldEntity>,
+        @InjectRepository(FortuneEntity)
+        private fortuneRepository: Repository<FortuneEntity>,
+    ){}
 
 
     getOne(){
     getOne(){
 
 
@@ -16,28 +20,33 @@ export class BenchService {
 
 
     async getMultiple(totalQueries: string) {
     async getMultiple(totalQueries: string) {
 
 
-        return new Promise(async (resolve, reject) => {
-            const worldArr = [];
-            const total = this.sanitizeQueries(totalQueries);
-            for (let i = 0; i < total; i++) {
-                worldArr.push(await this.getOne());
-            }
-            resolve(worldArr);
-        });
+        const worldArr = [];
+        const total = this.sanitizeQueries(totalQueries);
+        for (let i = 0; i < total; i++) {
+            worldArr.push(await this.getOne());
+        }
+        return worldArr;
     }
     }
 
 
     async updateMultiple(totalQueries: string) {
     async updateMultiple(totalQueries: string) {
 
 
-        return new Promise(async (resolve, reject) => {
-            const worldArr = [];
-            const total = this.sanitizeQueries(totalQueries);
-            for (let i = 0; i < total; i++) {
-                let worldToUpdate = await this.getOne();
-                worldToUpdate.randomnumber = Math.floor(Math.random() * 10000) + 1;
-                worldToUpdate = await this.worldRepository.save(worldToUpdate);
-                worldArr.push(worldToUpdate);
-            }
-            resolve(worldArr);
+        const worldArr = [];
+        const total = this.sanitizeQueries(totalQueries);
+        for (let i = 0; i < total; i++) {
+            let worldToUpdate = await this.getOne();
+            worldToUpdate.randomnumber = Math.floor(Math.random() * 10000) + 1;
+            worldArr.push(worldToUpdate);
+            await this.worldRepository.update(worldToUpdate.id, worldToUpdate);
+        }
+        return worldArr;
+    }
+
+    async getFortunes(){
+        return this.fortuneRepository.find().then((fortunes) => {
+            const newFortune = { id: 0, message: "Additional fortune added at request time." };
+            fortunes.push(newFortune);
+            fortunes.sort((a, b) => (a.message < b.message) ? -1 : 1);
+            return fortunes;
         });
         });
     }
     }
 
 

+ 7 - 1
frameworks/TypeScript/nest/src/main.ts

@@ -1,6 +1,8 @@
 import 'dotenv/config';
 import 'dotenv/config';
 import { NestFactory } from '@nestjs/core';
 import { NestFactory } from '@nestjs/core';
+import { NestExpressApplication } from '@nestjs/platform-express';
 import { AppModule } from './app.module';
 import { AppModule } from './app.module';
+import { join } from 'path';
 import { Logger } from '@nestjs/common';
 import { Logger } from '@nestjs/common';
 import * as cluster from 'express-cluster';
 import * as cluster from 'express-cluster';
 
 
@@ -9,7 +11,11 @@ const port = process.env.PORT || 8080;
 
 
 async function bootstrap() {
 async function bootstrap() {
   await cluster(async (w)=>{
   await cluster(async (w)=>{
-    const app = await NestFactory.create(AppModule);
+    const app = await NestFactory.create<NestExpressApplication>(AppModule);
+
+    app.setBaseViewsDir(join(__dirname, 'views'));
+    app.setViewEngine('hbs');
+
     Logger.log(`Listening on port ${port}`, 'Nest Server');
     Logger.log(`Listening on port ${port}`, 'Nest Server');
     return  app.listen(port)
     return  app.listen(port)
   }, {});
   }, {});

+ 20 - 0
frameworks/TypeScript/nest/src/views/fortunes.hbs

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<title>Fortunes</title>
+</head>
+<body>
+<table>
+<tr>
+<th>id</th>
+<th>message</th>
+</tr>
+{{#fortunes}}
+<tr>
+<td>{{id}}</td>
+<td>{{message}}</td>
+</tr>
+{{/fortunes}}
+</table>
+</body>
+</html>

+ 5 - 0
package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "hbs": "^4.0.4"
+  }
+}