Skip to content

Instantly share code, notes, and snippets.

@fdaciuk
Last active October 29, 2022 15:39
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fdaciuk/e1b699fbdef80266fc7e6e0c7cd8e3b5 to your computer and use it in GitHub Desktop.
Save fdaciuk/e1b699fbdef80266fc7e6e0c7cd8e3b5 to your computer and use it in GitHub Desktop.
MongoDB provider para AdonisJS (v4)

MongoDB provider para AdonisJS (v4)

Os exemplos abaixo utilizam o Yarn para instalação das dependências, mas se você preferir, pode usar o NPM sem problemas :)

  • Instale o driver do mongo no seu projeto:
yarn add --exact mongodb
  • Crie o diretório app/Providers se ele ainda não existir;
  • Dentro desse diretório, crie um diretório AdonisMongoDb;
  • Dentro do diretório AdonisMongoDb, crie um arquivo chamado AdonisMongoProvider.js com o seguinte conteúdo:
'use strict'

const { ServiceProvider } = require('@adonisjs/fold')
const AdonisMongoDb = require('./AdonisMongoDb')
const Helpers = use('Helpers')

class AdonisMongoProvider extends ServiceProvider {
  register () {
    this.app.singleton('MongoClient', () => {
      const Config = this.app.use('Adonis/Src/Config')
      return new AdonisMongoDb(Config)
    })
  }

  async boot () {
    const Env = this.app.use('Env')
    if (!Helpers.isAceCommand()) {
      const MongoClient = this.app.use('MongoClient')
      await MongoClient.connect()
    }
  }
}

module.exports = AdonisMongoProvider
  • Agora, dentro do mesmo diretório AdonisMongoDb, crie um outro arquivo chamado AdonisMongoDb.js com o seguinte conteúdo:
'use strict'

const { MongoClient } = require('mongodb')

class AdonisMongoDb {
  constructor (config) {
    const uri = '<protocol>://<username>:<password>@<host>/<dbname>'
      .replace('<protocol>', config.get('database.mongo.protocol'))
      .replace('<host>', config.get('database.mongo.host'))
      .replace('<username>', config.get('database.mongo.user'))
      .replace('<password>', config.get('database.mongo.password'))
      .replace('<dbname>', config.get('database.mongo.database'))

    const params = {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    }

    this.client = new MongoClient(uri, params)
    this.dbName = config.get('database.mongo.database')
  }

  async connect () {
    if (this.db) {
      return
    }

    await this.client.connect()
    this.db = this.client.db(this.dbName)
  }

  close () {
    return this.client.close()
  }

  collection (collectionName) {
    return this.db.collection(collectionName)
  }
}

module.exports = AdonisMongoDb
  • No arquivo config/database.js, adicione a configuração para o MongoDB dentro do objeto exportado:
/*
|--------------------------------------------------------------------------
| Mongo
|--------------------------------------------------------------------------
|
| Here we define connection settings for MongoDB database.
|
| npm i --save mongodb
|
*/
mongo: {
  protocol: Env.get('MONGO_PROTOCOL', 'mongodb+srv'),
  host: Env.get('MONGO_HOST'),
  user: Env.get('MONGO_USER'),
  password: Env.get('MONGO_PASSWORD'),
  database: Env.get('MONGO_DATABASE'),
},
  • Defina corretamente as variáveis de ambiente para conectar no seu banco MongoDB. Essa configuração funciona tanto para rodar o mongo localmente quando para usar Mongo Atlas.

  • E por fim, no arquivo start/app.js, adicione o provider do mongo na lista de providers:

const path = require('path')

const providers = [
  // lista com seus providers
  path.join(__dirname, '..', 'app', 'Providers', 'AdonisMongoDb', 'AdonisMongoProvider'),
]

E pronto! Para usar, só precisa importar o MongoClient:

const MongoClient = use('MongoClient')

E então fazer qualquer ação selecionando uma collection:

MongoClient.collection('users').findOne(...) // após o uso da `collection`, pode usar qualquer método do driver do mongodb padrão.

O banco padrão selecionado é o que estiver na variável de ambiente MONGO_DATABASE. Se quiser usar outro banco em algum ponto específico do seu app, pode usar:

MongoClient.client.db('outro-banco').collection('sua-collection') // aqui vc consegue selecionar a collection `sua-collection` do banco `outro-banco` configurado na mesma conexão do Mongo.

:)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment