如何在nestJS框架中注入纯数据库(没有ORM)?

siv*_*n m 3 database nestjs

我想使用 NestJS 框架。但更喜欢自己写SQL查询,而不是使用ORM的繁重接口。

我找到了一些教程,其中有直接访问数据库的示例,但它们没有使用NestJS的注入机制。因此,我正在尝试学习如何编写薄层控制器和服务提供程序,这使我可以自由地将查询作为文本参数提供。会感谢您的建议

小智 7

假设您想要将纯 Postgres 与 NestJs 结合使用(不带 ORM)。

您可以执行以下步骤:

创建一个单独的数据库模块,然后创建并注入自定义提供程序

import { Module } from "@nestjs/common";
import { Pool } from "pg";
import { PG_CONNECTION } from "../constants";


export const PG_CONNECTION = 'PG_CONNECTION';

const dbProvider = {
  provide: PG_CONNECTION,
  useValue: new Pool({
    user: "postgres",
    host: "localhost",
    database: "somedb",
    password: "meh",
    port: 5432,
  }),
};

@Module({
  providers: [dbProvider],
  exports: [dbProvider],
})
export class DbModule {}


Run Code Online (Sandbox Code Playgroud)

笔记:请导出您的自定义提供程序,因为我们在其他模块中需要此提供程序(服务)。

之后,您可以通过导入DbModule轻松将该提供程序(服务)注入到任何其他模块中


@Module({
  providers: [AppService],
  imports : [DbModule]
})
export class AppModule {}


Run Code Online (Sandbox Code Playgroud)

之后,您可以轻松注入提供程序并可以使用纯 SQL 查询执行数据库操作

import { Injectable, Inject } from '@nestjs/common';
import { PG_CONNECTION from './constants'; 

@Injectable()
export class AppService { 
  constructor(@Inject(PG_CONNECTION) private conn: any) {}
    
  async getUsers() { 
    const res = await this.conn.query('SELECT * FROM users');
    return res.rows;
  }


} 

Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

您可以进一步阅读这篇文章以获得更好的解释。 参考https://medium.com/@calleja.justin/using-plain-pg-with-nest-js-617ec32ec2c4

  • 请记住,以这种方式使用数据库会使您的应用程序容易受到 SQL 注入的攻击。 (2认同)