{"id":50358628,"url":"https://github.com/pomelott/koa-ts-node","last_synced_at":"2026-05-30T00:01:26.325Z","repository":{"id":42088797,"uuid":"190383049","full_name":"pomelott/koa-ts-node","owner":"pomelott","description":"🌈 a pure server-end koa framework which use ts-node and typescript directly.","archived":false,"fork":false,"pushed_at":"2023-01-07T21:02:55.000Z","size":474,"stargazers_count":0,"open_issues_count":17,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2023-03-21T09:20:14.767Z","etag":null,"topics":["koa","koa2","pm2","ts-node","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/pomelott/koa-ts-node","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pomelott.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-06-05T11:34:26.000Z","updated_at":"2021-07-13T07:20:44.000Z","dependencies_parsed_at":"2023-02-08T01:47:38.299Z","dependency_job_id":null,"html_url":"https://github.com/pomelott/koa-ts-node","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/pomelott/koa-ts-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pomelott%2Fkoa-ts-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pomelott%2Fkoa-ts-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pomelott%2Fkoa-ts-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pomelott%2Fkoa-ts-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pomelott","download_url":"https://codeload.github.com/pomelott/koa-ts-node/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pomelott%2Fkoa-ts-node/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33675019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["koa","koa2","pm2","ts-node","typescript"],"created_at":"2026-05-30T00:01:24.725Z","updated_at":"2026-05-30T00:01:26.294Z","avatar_url":"https://github.com/pomelott.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# koa-ts-node\n\n* a pure server-end koa framework which use ts-node and typescript directly.\n\n* use pm2 \u0026 ts-node\n\n* if like this please ⭐️star⭐ on github.\n\n* welcome to issue.\n\n## Features\n\n* more flexible customize\n* Use typescript directly without compiling to js file.\n* Object-oriented programming\n* more convenient router、controller、model、service、middleware、routerMiddleware\n* provide orm operation with transactions\n* provide log with higher readability.\n* support SSR with [nunjucks](http://mozilla.github.io/nunjucks/)\n\n## Npm script\n\n* `npm run create-model`:  create model from mysql(you can config to use other db) to orm/, first to config db in lib/conf/db\n\n* `npm run server`:  launch by pm2\n\n* `npm run debug`:  launch by ts-node when develop or debug\n\n## Router\n\n| option | type | necessary | default | example | description |\n|:---:|:---:|:---:|:---:|:---:|:---:|\n| type | string | false |'get'|'get'、'post'| the method for http request |\n| route | string | true | - | '/user'|the path for request |\n| controller | string | false |the file based on controller/ according to the router path | 'user.inter' |specify the controller file|\n| middleware | Array\\\u003cstring\u003e | false | - | 'user.check''|specify the routerMiddleware file based on routerMiddleware/specific/ |\n\n\u0026nbsp;\n\n### router example\n\n```ts\nexport default {\n    priority: {\n        route: '/priority',\n        middleware: ['user.priority']\n    },\n    check: {\n        route: '/check',\n        middleware: ['user.check'],\n\n    },\n    testRepository: {\n        route: '/repository',\n        middleware: ['user.repository']\n    }\n}\n```\n\n## Controller\n\n```ts\nimport Controller from '@class/Controller';\nexport default class Priority extends Controller {\n    private async priority () {\n        // function name refer to the router keyname\n    }\n}\n```\n\n## Model\n\n* orm framework based on typeorm, for detail: [typeorm](https://github.com/typeorm/typeorm)\n\n* operate the table(mysql) directly\n\n### repository way\n\n```ts\nimport Model from '@class/Model';\nimport {User} from '../../orm/entities/User';\nexport default class extends Model{\n    private async testRepository () {\n        let userRepo = await this.repository('User');\n        let newAdd = new User();\n        newAdd.name = 'add from repo';\n        newAdd.addr = 'add from repo';\n        newAdd.phone = '18833339999';\n        userRepo.save(newAdd);\n    }\n\n    private async getAll () {\n        let userRepo = await this.repository('User');\n        return await userRepo.find();\n    }\n}\n```\n\n### queryRunner way\n\n* this way can support transaction\n\n```ts\n// controller file\nimport Controller from '@class/Controller';\nexport default class Priority extends Controller {\n    private async priority () {\n        let userModel = await this.model('user.inter');\n        let qr = await this.getQueryRunner();\n        let manager = qr.manager;\n        qr.startTransaction();\n        await userModel.addUser(qr);\n        let firstUser = await userModel.getFirst(qr);\n        if (firstUser.name === 'tate') {\n            qr.rollbackTransaction();\n        } else {\n            qr.commitTransaction();\n        }\n        let allUser = await manager.find('User');\n        this.response.body = allUser;\n    }\n\n    private async check () {\n        let qr = await this.getQueryRunner();\n        let userService = await this.service('user.userService');\n        this.response.body = await userService.priorityService(qr);\n    }\n}\n```\n\n```ts\n// model file\nimport Model from '@class/Model';\nimport {User} from '../../orm/entities/User';\nimport { QueryRunner } from 'typeorm';\nexport default class extends Model{\n    // private test: string = '';\n    private async addUser (qr: QueryRunner) {\n        let newAdd = new User();\n        newAdd.name = '炒面 tate';\n        newAdd.addr = 'test addr';\n        newAdd.phone = '12399992222';\n        await qr.manager.save(newAdd);\n    }\n\n    private async getFirst (qr: QueryRunner) {\n        return await qr.manager.findOne('User');\n    }\n}\n```\n\n## Service\n\n* when used queryRunner way in model file, then you can use transaction in service file.\n\n```ts\nimport Service from \"@class/Service\";\nimport { QueryRunner } from \"typeorm\";\n\nexport default class extends Service{\n    private async priorityService (qr: QueryRunner) {\n        let userModel = await this.model('user.inter');\n        qr.startTransaction();\n        await userModel.addUser(qr);\n        let firstOne = await userModel.getFirst(qr);\n        if (firstOne.name === 'tate') {\n            qr.rollbackTransaction();\n        } else {\n            qr.commitTransaction()\n        }\n        let allUser = await qr.manager.find('User');\n        return allUser;\n    }\n}\n```\n\n## Notice\n\n* for detail, please view the source code.\n* the api document will be published later.\n\n## Links\n\n* [import-esm-directory](https://github.com/pomelott/import-esm-directory)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpomelott%2Fkoa-ts-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpomelott%2Fkoa-ts-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpomelott%2Fkoa-ts-node/lists"}