Saat ini ada 3 opsi untuk menggunakan Mongo dengan Node (dan NestJS).

Kami akan memeriksa masing-masingnya dan saya akan memberikan contoh bagaimana Anda dapat menggunakan MongoDB di aplikasi NestJS Anda tanpa pusing.

1) NestJS + Mongoose mungkin tutorial terbaik yang saya temukan ada di sini https://scotch.io/tutorials/building-a-modern-app-using-nestjs-mongodb-and-vuejs masalahnya adalah saya benci kenyataan bahwa saya harus menulis definisi skema dan antarmuka skrip ketikan. Jika Anda baik-baik saja dengan menulis semuanya 2 kali, yaitu Skema dan Dokumen sebagai Antarmuka Naskah, mungkin ini cara terbaik untuk melakukannya!

2) NestJS + TypeORM di mana Anda sebenarnya dapat menggunakan TypeORM dengan MongoDB, namun saya tidak merekomendasikan ini jika Anda ingin mempelajari lebih lanjut, saya akan meminta Anda untuk menulis postingan blog ini https://medium.com /articode/typeorm-mongodb-review-8855903228b1

3) NestJS + Typegoose — pada dasarnya yang dilakukannya adalah menggunakan objek domain Anda untuk mendapatkan skema dari objek tersebut. Dan inilah isi postingan ini. Ada banyak dokumentasi bagaimana Anda dapat mencapainya, namun saya tidak menyukai sebagian besarnya, sepertinya terlalu banyak kode. Selain itu SEMUA tutorial SELALU menyertakan penggunaan kelas DTO dan saya tidak melihat alasan untuk menggunakan kelas DTO sama sekali dalam 99% kasus. DTO itu bagus, jangan salah paham, ada banyak kelebihan dalam menggunakan DTO, tetapi tidak ada satupun tutorial di internet yang benar-benar menjelaskan mengapa mereka menginginkan DTO dan faktanya tidak ada satupun yang membutuhkan DTO jadi saya ingin menulis yang paling mudah cara mudah dengan NestJS + MongoDB + dan TypeGoose.

Jadi pertama-tama kita akan menginstal NestJS CLI, NestJS sangat, sangat mirip dengan Angular dan bahkan jika Anda tidak menyukai sudut, percayalah Anda akan menyukai NestJS, karena saya sebenarnya sama! Btw tutorial pemula yang bagus untuk NestJS, Anda dapat membaca di sini, temukan https://scotch.io/tutorials/getting-started-with-nestjs

Jadi mari kita mulai dengan membuat aplikasi NestJS

npm saya -g @nestjs/cli

Kemudian buat proyek NestJS.

sarang sarang jspoc-sarang baru

cd sarangjspoc-sarang

// memulai aplikasi menggunakan nodemon
npm run start:dev

buka browser ke localhost:3000 untuk memverifikasi hello world ditampilkan.

Oke, kita akan membuat Layanan dan Pengontrol sederhana dalam sebuah Modul, katakanlah aplikasi kita akan melakukan sesuatu dengan Pengguna dan kita menginginkan UserModule yang akan menampung objek domain Pengguna, layanan Pengguna, dan pengontrol pengguna.

sarang menghasilkan pengguna modul

sarang menghasilkan pengguna layanan
sarang menghasilkan pengguna pengontrol

Sekarang Anda harus memiliki folder yang memiliki UserModule, UserService dan UserController.

Yang hampir kosong.

Di Nest, kita akan menggunakan nestjs-typegoose karena ini membuat segalanya menjadi lebih mudah.

npm install — simpan nestjs-typegoose

typegoose memiliki beberapa dependensi rekan sehingga kita perlu menginstalnya juga. Dua dependensi nestjs sudah kita miliki namun kita memerlukan dua dependensi lainnya.

"@typegoose/typegoose": "^6.0.0",
"@nestjs/common": "^6.3.1",
"@nestjs/core": "^6.3.1",
"mongoose": "^5.5.13"

Yang sudah selesai, package.json Anda akan terlihat seperti ini:

{
  "name": "nestjspoc",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "license": "MIT",
  "scripts": {
    "prebuild": "rimraf dist",
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "tslint -p tsconfig.json -c tslint.json",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@nestjs/common": "^6.7.2",
    "@nestjs/core": "^6.7.2",
    "@nestjs/platform-express": "^6.7.2",
    "nestjs-typegoose": "^7.0.0",
    "rimraf": "^3.0.0",
    "rxjs": "^6.5.3",
    "@typegoose/typegoose": "^6.0.0",
    "mongoose": "^5.5.13"
  },
  "devDependencies": {
    "@nestjs/cli": "^6.9.0",
    "@nestjs/schematics": "^6.7.0",
    "@nestjs/testing": "^6.7.1",
    "@types/express": "^4.17.1",
    "@types/jest": "^24.0.18",
    "@types/node": "^12.7.5",
    "@types/supertest": "^2.0.8",
    "jest": "^24.9.0",
    "prettier": "^1.18.2",
    "supertest": "^4.0.2",
    "ts-jest": "^24.1.0",
    "ts-loader": "^6.1.1",
    "ts-node": "^8.4.1",
    "tsconfig-paths": "^3.9.0",
    "tslint": "^5.20.0",
    "typescript": "^3.6.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".spec.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "coverageDirectory": "./coverage",
    "testEnvironment": "node"
  }
}

Yang kami tambahkan secara manual dicetak tebal.

Nah ini setupnya, mari kita tulis beberapa kode.

Buat pengguna objek domain Anda di file user.ts misalnya:

import {prop, Typegoose} from '@typegoose/typegoose';

export class User extends Typegoose {
    @prop()
    name?: string;
}

Anda melihat @prop() ya Anda memerlukan ini. Anda dapat mempelajari lebih lanjut tentang validasi dan apa yang dapat Anda lakukan di dokumentasi typegoose.
Lalu mari buat atau perbarui kelas UserService kami.

import {Injectable} from '@nestjs/common';
import {User} from './domain/user';
import {InjectModel} from 'nestjs-typegoose';
import {ReturnModelType} from '@typegoose/typegoose';

@Injectable()
export class UserService {
    constructor(@InjectModel(User) private readonly userModel: ReturnModelType<typeof User>) {
    }

    async createCustomUser(user: User) {
        const createdUser = new this.userModel(user);
        return await createdUser.save();
    }

    async listUsers(): Promise<User[] | null> {
        return await this.userModel.find().exec();
    }
}

Oke, keajaiban pertama sebenarnya ada di sini!

Anda mungkin memperhatikan baris @InjectModel(User) private readonly userModel: ReturnModelType, ini akan memberi kita userModel yang dapat kita gunakan untuk tipe Pengguna kita.

CreateCustomUser dan listUsers menggunakan userModel ini dan saya yakin semuanya sudah jelas BAGAIMANA :)

Selanjutnya perbarui UserController kami.

import {Body, Controller, Get, Post} from '@nestjs/common';
import {UserService} from './user.service';
import {User} from './domain/user';

@Controller('user')
export class UserController {
    constructor(private readonly userService: UserService) { }

    @Get('listusers')
    async listUsers(): Promise<User[] | null> {
        return await this.userService.listUsers();
    }

    @Post('createuser')
    async createUser(@Body() cat: User): Promise<User> {
        return await this.userService.createCustomUser(cat);
    }
}

Tidak ada yang mewah di sini, kami hanya memasukkan Layanan kami dan memanggil dua metode kami.

Sedikit keajaiban lagi!

Ada dua baris ajaib lagi, yang perlu Anda tambahkan ke UserModule dan AppModule Anda

Pada definisi UserModule kita memerlukan baris ini imports: [TypegooseModule.forFeature([User])]:

import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
import {User} from './domain/user';
import {TypegooseModule} from 'nestjs-typegoose';

@Module({
  imports: [TypegooseModule.forFeature([User])],
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}

Dan di AppModule kita memerlukan konfigurasi Mongoose dari impor string koneksi MongoDB:

impor: [TypegooseModule.forRoot('mongodb://localhost:27017/nest'),
UserModule],

import {Module} from '@nestjs/common';
import {AppController} from './app.controller';
import {AppService} from './app.service';
import {UserModule} from './user/user.module';
import {TypegooseModule} from 'nestjs-typegoose';

@Module({
    imports: [TypegooseModule.forRoot('mongodb://localhost:27017/nest'),
        UserModule],
    controllers: [AppController],
    providers: [AppService],
})
export class AppModule {
}

Dan ya, Anda memerlukan MongoDB untuk dapat berjalan;)

Itu dia!

Mengujinya - dengan cara yang monyet!

Buat pengguna:

curl -X POST http://localhost:3000/user/createuser -H 'Jenis Konten: aplikasi/json' -d '{ “nama”: “Nayden Gochev” }’

Dan Anda akan menerima

{“_id”:”5dc00795d9a25df587a1e5f9,”nama”:”Nayden Gochev”,”__v”:0}

Daftar semua pengguna:

curl -X DAPATKAN http://localhost:3000/user/listusers

Bagian yang hilang!

Apa yang hilang ? Validasi, Keamanan, dan Pengujian tentu saja, semua ini — lain kali ;) sekarang adalah waktu yang tepat.

Kode sumber

kode sumber lengkap dapat diunduh di sini:
https://github.com/gochev/nest-js-poc-mongodb

Tentang saya:

Saya seorang pengembang Java dengan banyak pengetahuan Spring, tetapi baru-baru ini saya harus menulis beberapa JavaScript meskipun saya tidak mau, jadi mungkin itu menjelaskan mengapa saya menyukai NestJS, dan ya, ini dilakukan di Java dan Spring jauh lebih mudah https://github.com/gochev/spring-mvc-poc-mongodb tapi menyenangkan dengan NestJS bukan? :)

Awalnya diterbitkan di http://gochev.blogspot.com pada 4 November 2019.