mysql - 带有 Typescript 的 NodeJS MySQL 中的数据库 Controller

标签 mysql node.js typescript express

我正在用 nodejs、express 和 mysql 开发一个 restAPI。现在我有一个 app.js,它是应用程序的起点。

在 app.js 中我初始化了 UserController:

const router: express.Router = express.Router();
new UserController(router);

用户 Controller 看起来像这样:

import { Request, Response, Router } from 'express';
import UserModel from '../model/user';

class UserController {

  constructor(private router: Router) {

    router.get('/users', async (req: Request, resp: Response) => {
      try {
        // const users = get Users with mysql
        // resp.status(200).send(users);
      } catch (error) {
        resp.send({
          msg: 'Not found',
          status: 404
        });
      }
    });

  }

}

export default UserController;

现在我想要一个 DatabaseController 来处理数据库周围的所有事情,比如提供连接、关闭它等等:

class DatabaseController {

  constructor() {

  }

}

export default DatabaseController;

我如何实现在 DatabaseController 中打开连接并让 UserController 简单地访问它?如果不初始化 DatabaseController 并为 UserController 提供参数“dbConnection”,这是否可能?

最佳答案

是的,这是可能的。我不完全熟悉 typescript ,所以下面有一些伪代码。 未经测试

在另一个文件的某处,配置您的数据库连接和服务:

import { MyConnection } from 'my-db-package';

class DatabaseService {
  private connection: MyConnection

  constructor(db: MyConnection) {
    this.connection = db;
  }

  // Return the promise if any.
  // Don't want to handle the error here.
  // Let your controller handle the error
  async openConnection() {
    return this.connection.open()
  }

  async closeConnection() {
    return this.connection.close()
  }

  async getAllUsers() {
    return this.connection.query('SELECT * FROM USERS;')
  }

}

export default DatabaseService;

import { Database } from 'my-db-driver'
import { DatabaseService } from 'my-db-service'

// Don't actually connect here
// Just create the object so it's ready for connection.
const connection = new Database({
  // config
})

// Wire up the internal db connection
// Remember this is a singleton.
export default new DatabaseService(connection)

接下来将您的 Controller 与新的数据库服务连接起来:

import { Request, Response } from 'express';
import { DatabaseService } from './my-service'

class UserController {
  private dbService: DatabaseService;

  constructor(dbService: DatabaseService) {
    this.dbService = dbService;
  }

  async connect() {
    return this.dbService.openConnection()
  }

  async close() {
    return this.dbService.closeConnection()
  }

  async getAllUsers(req: Request, res: Response) {
    let users

    try {
      users = await this.dbService.getAllUsers();
    } catch (error) {
      // ...
    }

    res.json(users)
  }

}

export default UserController;

然后连接你的路线:

import { express } from 'express'
import { UserController } from 'user-controller'
import { DatabaseService } from 'database-service'

const userController = new UserController(DatabaseService);
const router: express.Router = express.Router();

router.get('/users', userController.getAllUsers)
// ...

export default router

最后,将您的路线与主 Express 应用 Hook :

import { express } from 'express'
import { userRoutes } from 'user-routes'

const app = express()

app.use(userRoutes)
// ..

同样,上述代码未经测试,可能无法使用。它旨在为您提供一种方法的示例。您可能会找到更好的方法,但这就是它的要点。

关于mysql - 带有 Typescript 的 NodeJS MySQL 中的数据库 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49707730/

相关文章:

mysql - 如何提高选择案例的性能?

php - 如何使用内连接从其他表中获取记录

node.js - 如何处理 Typescript 中未分配的变量

javascript - Array.push 不是 ionic 4 Angular 中的函数问题

php - 如何使用 Mysqli Php 返回受多次插入影响的行数?

MySQL 查询 - 在一个查询中进行加法、计数和除法

node.js - Azure Javascript SDK 无法为访问层为 'Archive' 的 Blob 复制 Blob (sync/beginCopyBlobUrl)

javascript - 如何在 twitch 机器人中分隔变量

javascript - discord.js 中的 User 和 GuildMember 有什么区别?

Typescript 无法为函数对象推断出正确的参数类型