NestJSlà một khung web JavaScript tương đối mới cho phép bạn xây dựng các ứng dụng phía máy chủ, cấp doanh nghiệp. Nó mạnh mẽ, thực thi các phương pháp hay nhất và sử dụng các tính năng JavaScript mới nhất. Nó cũng có hỗ trợ mặc định cho TypeScript và sử dụngLoạiORM, một thư viện quản lý quan hệ đối tượng mạnh được xây dựng bằng TypeScript.
Với hơn29,3k sao trên GitHub, TypeORM là một trong những ORM Node.js phổ biến nhất. Bên cạnh việc không tin vào cơ sở dữ liệu, TypeORM còn có một API duy nhất cho phép bạn truy cập dữ liệu trong cơ sở dữ liệu SQL, chẳng hạn như MYSQL và PostgreSQL và cơ sở dữ liệu NoSQL, như MongoDB, theo nhiều cách khác nhau bằng cách sử dụng các mẫu Bản ghi hoạt động và Trình ánh xạ dữ liệu.
Trong phần này, chúng ta sẽ tìm hiểu cách tích hợp TypeORM với NestJS, thêm trình điều khiển cơ sở dữ liệu và chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS.
Để làm theo hiệu quả cùng với bài viết này, bạn nên có:
- Node.jsv12 LTS hoặc Node >v14 được cài đặt trên máy tính của bạn —NVMgiúp chuyển đổi giữa các phiên bản khác nhau của Node.js dễ dàng hơn nhiều
- Kiến thức làm việc cơ bản về NestJS và JavaScript
Cần phải chải lên trên một số vấn đề cơ bản? Kiểm tra bài viết thực tế này trênxây dựng ứng dụng thương mại điện tử với NestJS.
Bắt đầu nào!
Mục lục
- Thiết lập NestJS
- Tạo thiết lập ứng dụng cơ bản
- Định cấu hình TypeORM với SQLite
- Tạo các thực thể cơ sở dữ liệu
- Chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS
- Sử dụng THAM GIA trong Truy vấn TypeORM với NestJS
- Sử dụng tùy chọn tìm
- Sử dụng QueryBuilder để THAM GIA
Việc thiết lập NestJS rất đơn giản và có một số cách để thực hiện, tùy thuộc vào nhu cầu của bạn. Tuy nhiên, trong bài viết này, chúng tôi sẽ cài đặt nó với CLI.
npx @nestjs/[email được bảo vệ]ứng dụng tổ mới
Lệnh này sẽ tạo khung cho NestJS “Xin chào, Thế giới!” ứng dụng soạn sẵn, vì vậy bạn có thể tham gia ngay và bắt đầu viết mã.
Bây giờ chúng tôi đã cài đặt NestJS, hãy tích hợp TypeORM vào ứng dụng của chúng tôi. Hãy chú ý đến phần này; bạn sẽ cần tích hợp TypeORM đúng cách trước khi có thể bắt đầu viết các truy vấn của mình.
Chạy lệnh này trên thiết bị đầu cuối của bạn để cài đặt trình điều khiển TypeORM và SQLite3 — chúng tôi sẽ sử dụng SQLite trong hướng dẫn này để giảm bớt sự phức tạp của việc cài đặt và thiết lập cơ sở dữ liệu MySQL hoặc PostgreSQL.
cài đặt npm @nestjs/typeorm sqlite3
Tạo thiết lập ứng dụng cơ bản
Tiếp theo, hãy tạo các bộ điều khiển và dịch vụ cho bộ khung của ứng dụng truy vấn của chúng ta bằng NestJS CLI. Chạy lệnh sau để tạo nó và chọn lớp vận chuyển API REST.
npx @nestjs/[email được bảo vệ]bài đăng tài nguyên g
Nó sẽ hỏi bạn có muốn tạo điểm vào CRUD hay không. Lựa chọnĐúng. Sẽ mất một chút thời gian để tạo mọi thứ cho bạn, nhưng đó là một trong những khía cạnh hữu ích của NestJS.
Cấu trúc thư mục của bạn bây giờ sẽ trông như thế này:
.├── README.md├── dist├── Nest-cli.json├── package-lock.json├── package.json├── src│ ├── app.controller.spec.ts│ ├ ── app.controller.ts│ ├── app.module.ts│ ├── app.service.ts│ ├── main.ts│ └── posts│ ├── dto│ │ ├── tạo bài đăng .dto.ts│ │ └── update-post.dto.ts│ ├── entity│ │ └── post.entity.ts│ ├── posts.controller.spec.ts│ ├── posts.controller. ts│ ├── posts.module.ts│ ├── posts.service.spec.ts│ └── posts.service.ts├── test├── tsconfig.build.json├── tsconfig.json└─ ─ sợi.lock
Định cấu hình TypeORM với SQLite
Bây giờ, hãy định cấu hình TypeORM trongsrc/app.module.ts
tài liệu.
Ban đầu, nó sẽ trông như thế này:
// src/app.module.tsimport { Module } từ '@nestjs/common';nhập { AppController } từ './app.controller';nhập { AppService } từ './app.service';nhập { PostModule } từ './posts/posts.module';@Module({ nhập: [PostsModule], bộ điều khiển: [AppController], nhà cung cấp: [AppService],})xuất lớp AppModule {}
Nhập các tùy chọn kết nối SQLite, mô-đun TypeORM và thực thể bài đăng, như được hiển thị trong mã bên dưới:
// src/app.module.tsimport { Module } từ '@nestjs/common';nhập { TypeOrmModule } từ '@nestjs/typeorm';nhập { SqliteConnectionOptions } từ 'typeorm/driver/sqlite/SqliteConnectionOptions';nhập { AppController } từ './app.controller';nhập { AppService } từ './app.service';nhập { Bài đăng } từ './posts/entities/post.entity';nhập { PostModule } từ './posts/ posts.module';const config: SqliteConnectionOptions = { loại: "sqlite", cơ sở dữ liệu: "../db", các thực thể: [Bài đăng], đồng bộ hóa: true}@Module({ nhập khẩu: [PostsModule, TypeOrmModule.forRoot(config )], bộ điều khiển: [AppController], nhà cung cấp: [AppService],})xuất lớp AppModule {}
Bây giờ, hãy làm việc thông qua bản cập nhật mà chúng tôi vừa thêm. Đầu tiên, nhìn vào hình dạng của đối tượng cấu hình, chúng tôi đã thêm cơ sở dữ liệu và các thực thể và đồng bộ hóa cơ sở dữ liệu. Tuy nhiên, điều quan trọng cần nhớ là đồng bộ hóa cơ sở dữ liệu không phải là điều bạn nên làm trong môi trường sản xuất, vì nó có thể dẫn đến mất dữ liệu.
// cấu hình configconst: SqliteConnectionOptions = { type: "sqlite", cơ sở dữ liệu: "../db", các thực thể: [Post], đồng bộ hóa: true // được đặt thành false khi sản xuất }
Bởi vì chúng tôi đang sử dụng cơ sở dữ liệu SQLite, chúng tôi có thể nhanh chóng thêm đường dẫn đến cơ sở dữ liệu bằng"../db",
. Nếu nó không tồn tại, nó sẽ tự động được tạo cho bạn. Đối với MySQL hoặc PostgreSQL, các hình dạng khác nhau, vì vậy hãy xemtài liệuđể tìm hiểu thêm.
Tạo các thực thể cơ sở dữ liệu
Các thực thể là các mô hình cơ sở dữ liệu và, trong trường hợp của chúng tôi,Bưu kiện
thực thể có ID và tiêu đề, như được hiển thị trong mã bên dưới:
// src/post/entities/post.entity.tsimport { Column, Entity, PrimaryGeneratedColumn } from "typeorm";@Entity()export class Post { @PrimaryGeneratedColumn() id: number; @Column() tiêu đề: chuỗi;}
Cuối cùng, trên thiết lập TypeORM của ứng dụng chung, hãy kết nối cấu hình TypeORM với NestJS. Lưu ý.forRoot
vì bạn có thể thấy điều gì đó tương tự khi thiết lập cấu hình cấp tính năng.
nhập: [PostsModule, TypeOrmModule.forRoot(config)],
Ở đây, chúng tôi đã kết nối TypeORM với NestJS. Tiếp theo, hãy tích hợp của chúng tôiBưu kiện
tính năng với ORM.
Điều hướng đếnsrc/posts/posts.module.ts
và cập nhật nó với cấu hình sau:
// src/posts/posts.module.tsimport { Module } từ '@nestjs/common';nhập { PostService } từ './posts.service';nhập { PostController } từ './posts.controller';@Module ({ bộ điều khiển: [PostController], nhà cung cấp: [PostsService]})xuất lớp PostModule {}
Tiếp theo, nhập TypeORM,Bưu kiện
thực thể và cập nhật mã bằng cách đặt giá trị của mô-đun nhập với[TypeOrmModule.forFeature([Bài đăng])]
. Xin lưu ý rằng chúng tôi đang sử dụngchoTính năng
và chuyển vào một mảng các thực thể trái ngược với cấu hình mô-đun cấp ứng dụng.
nhập { Module } từ '@nestjs/common'; nhập { PostService } từ './posts.service'; nhập { PostController } từ './posts.controller'; nhập { TypeOrmModule } từ '@nestjs/typeorm'; nhập { Đăng } từ './entities/post.entity';@Module({ nhập: [TypeOrmModule.forFeature([Post])], bộ điều khiển: [PostController], nhà cung cấp: [PostsService]})xuất lớp PostModule {}
Chạy các truy vấn cơ bản với TypeORM QueryBuilder trong NestJS
Có một số cách để truy cập cơ sở dữ liệu bằng TypeORM và NestJS, bao gồm sử dụng API Kho lưu trữ, API Trình quản lý thực thể và bằng cách sử dụng API DataSource.
Dưới đây là một ví dụ nhanh về cách lấy một mục theo ID bằng cách sử dụng các API được đề cập ở trên. Tôi đã xóa hầu hết các mã không liên quan đến ví dụ này, nhưng bạn có thể tìm thấy mã hoàn chỉnh trênGitHub.
//src/posts/posts.service.ts@Injectable() xuất lớp PostService { constructor( @InjectRepository(Post) private postRepository: Repository, @InjectEntityManager() private postManager: EntityManager, @InjectDataSource() private dataSource: DataSource ) { } async findOne(id: number) { const postWithRepository = đang chờ this.postRepository.findOneBy({ id }); const postWithRepositoryQueryBuilder = đang chờ this.postRepository .createQueryBuilder("post") .where("post.id= :postId", { postId: id }) .getOne() const postWithEntityManager = đang chờ this.postManager .createQueryBuilder(Post, "post "). ) .where("post.id= :postId", { postId: id }) .getOne() trả về { postWithRepository, postWithRepositoryQueryBuilder, postWithEntityManager, postWithDataSource }; }}
Như bạn có thể thấy, chúng tôi đã khởi tạo các lớp truy cập dữ liệu trong hàm tạo và sau đó sử dụng chúng bên trong các phương thức.
//src/posts/posts.service.ts...constructor( @InjectRepository(Post) private postRepository: Repository, ) { }...
Ngoài ra, phần còn lại của mã chỉ là các truy vấn TypeORM cố định; bạn có thể khám phá sâu hơn về TypeORM bằng cách xemtài liệu.
Tất cả các truy vấn trong đoạn mã trên sẽ trả về cùng một kết quả. Vì vậy, có một số cách để đạt được một mục tiêu, nhưng phương pháp nào là hiệu quả nhất?
Khi làm việc với các tập dữ liệu nhỏ, hai phương thức hoạt động tương tự nhau. Tuy nhiên, tôi nhận thấy rằng API QueryBuilder hiệu quả hơn các truy vấn kho lưu trữ khi làm việc với các bộ dữ liệu lớn hơn có nhiều mối quan hệ. Tôi tin rằng điều này là doAPI trình tạo truy vấntương đối gần với các truy vấn SQL thô hơn so vớiAPI kho lưu trữ.
sử dụngTHAM GIA
truy vấn trong TypeORM với NestJS
Nếu bạn đã viết một Truy vấn SQL liên quan đến việc truy cập dữ liệu từ nhiều bảng bằng SQL, thì rất có thể bạn đã viết mộtTHAM GIA
truy vấn trước.THAM GIA
truy vấn cho phép bạn truy vấn dữ liệu từ nhiều bảng cùng một lúc. Hãy nhìn vào mộtCHỖ NỐI BÊN TRÁI
hoạt động trong TypeORM. Loại truy vấn này sẽ trả về tất cả các hàng từ bảng bên trái và các hàng phù hợp từ bảng bên phải.
Nhiều bài viết tuyệt vời từ LogRocket:
- Đừng bỏ lỡ giây phút nào vớiphát lại, một bản tin tuyển chọn từ LogRocket
- Học hỏicách Galileo của LogRocket loại bỏ tiếng ồn để chủ động giải quyết các sự cố trong ứng dụng của bạn
- Sử dụng useEffect của Reactđể tối ưu hóa hiệu suất ứng dụng của bạn
- Chuyển đổi giữanhiều phiên bản của nút
- Khám phá cách tạo hoạt ảnhứng dụng React của bạn với AnimXYZ
- Khám phá Kim Ngưu, một khuôn khổ mới để xây dựng nhị phân
- Ban cố vấn không chỉ dành cho giám đốc điều hành.Tham gia Ban cố vấn nội dung của LogRocket.Bạn sẽ giúp thông báo loại nội dung chúng tôi tạo và có quyền truy cập vào các cuộc gặp gỡ độc quyền, sự công nhận của xã hội và trò chơi điện tử.
Có một số cách để thực hiện mộtCHỖ NỐI BÊN TRÁI
hoạt động trong TypeORM. Hãy xem xét một số trong số họ:
- sử dụng
tìm thấy
tùy chọn - Sử dụngTrình truy vấn
Mặc dù trọng tâm của chúng tôi là sử dụng QueryBuilder, nhưng tôi sẽ chỉ cho bạn một ví dụ sử dụng cả hai tùy chọn để bạn có thể thấy sự khác biệt giữa hai tùy chọn.
Hãy xem SQL nàyCHỖ NỐI BÊN TRÁI
hoạt động dưới đây. Chúng tôi sẽ chuyển đổi nó để sử dụngtìm thấy
tùy chọn và phương thức QueryBuilder của TypeORM.
CHỌN * TỪ "người dùng"TRÁI THAM GIA "khóa học" "khóa học" BẬT "khóa học".."id" = "người dùng".."courseId"WHERE "khóa học".."name" = 'Nguyên tắc cơ bản về JavaScript' VÀ "khóa học".."length " = '8 giờ'
sử dụngtìm thấy
trong TypeORM
userRepository.find({ quan hệ: { khóa học: đúng }, trong đó: { khóa học: { tên: "Nguyên tắc cơ bản về JavaScript", độ dài: "8 giờ" }, },})
Đoạn mã trên là mộtCHỖ NỐI BÊN TRÁI
truy vấn bằng TypeORMtìm thấy
lựa chọn. May mắn thay, nó đơn giản vì TypeORM tìm ra cách tốt nhấtTHAM GIA
cho bạn và cung cấp cho bạn kết quả phù hợp. Bây giờ, hãy thực hiện truy vấn trên với TypeORM QueryBuilder.
Sử dụng QueryBuilder choTHAM GIA
const user = this.userManager .createQueryBuilder(User, "user") .leftJoin("course".."id", "course") .where("course.name = :name", { name: "JavaScript Fundamental" } ) .andWhere("course.length = :length", { length: "8hours" })
Khi sử dụng QueryBuilder, bạn cũng có các tùy chọn cho các loạiTHAM GIA
, không giống nhưtìm thấy
tùy chọn, thực hiện mọi thứ dưới mui xe.
Đây là một sốthêm vàoTHAM GIA
có sẵn trong TypeORM.
Phần kết luận
Nếu bạn đang muốn xây dựng một chương trình phụ trợ vững chắc một cách nhanh chóng mà không ảnh hưởng đến chất lượng, hãy cân nhắc sử dụng TypeORM. Trong bài viết này, chúng ta đã tìm hiểu cách tích hợp và sử dụng TypeORM QueryBuilder với NestJS, nhưng chúng ta mới chỉ sơ lược về những gì bạn có thể làm với TypeORM. Kiểm tra tài liệu TypeORM đểtìm hiểu thêm.
Chúc mừng hack!
- Thăm nomhttps://logrocket.com/signup/để lấy ID ứng dụng.
- Cài đặt LogRocket qua NPM hoặc thẻ script.
LogRocket.init()
phải được gọi là phía máy khách, không phải phía máy chủ. - NPM
- Thẻ tập lệnh
- (Tùy chọn) Cài đặt plugin để tích hợp sâu hơn với ngăn xếp của bạn:
- Redux phần mềm trung gian
- phần mềm trung gian ngrx
- plugin Vuex
$ npm Tôi --cứu đăng nhập tên lửa//Mã số:
nhập khẩu Nhật KýTên Lửa từ 'tên lửa';
Nhật KýTên Lửa.trong đó('ứng dụng/id');
Thêm vàovào HTML của bạn:<kịch bản src="https://cdn.lr-ingest.com/LogRocket.min.js"></kịch bản>
<kịch bản>cửa sổ.Nhật KýTên Lửa && cửa sổ.Nhật KýTên Lửa.trong đó('ứng dụng/nhận dạng');kịch bản>
Bắt đầu ngay bây giờ