Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Conexão com o MongoDB

Boa noite, eu estou tentando fazer a parte do curso onde isolo a conexão para um connection factory, mais não estou conseguindo fazer isso com o MongoDB.

Segue o código:

let mongoClient = require('mongodb').MongoClient;

module.exports = function(app) {
    app.get("/produtos",function(req, res) {

        let url = 'mongodb://localhost:27017/casadocodigo';

        mongoClient.connect(url, function(err, db) {
            console.log("Conexão estabelecida!");

            let collection = db.collection('produto');

            collection.find({}).toArray(function(err, result) {
                res.render('produtos/lista', {lista:result})
            });

            db.close();
        });

    });
}

queria isolar a parte da conexão, tentei fazer o seguinte:

let mongoClient = require('mongodb').MongoClient;

module.exports = function() {

    let url = 'mongodb://localhost:27017/casadocodigo';

    mongoClient.connect(url, function(err, db) {
        db.collection('produto');
    });

}

e tentei usar da seguinte forma:

let mongodb = require('../infra/connectionFactory');

module.exports = function(app) {
    app.get("/produtos",function(req, res) {

        let collection = mongodb.collection('produto');

        collection.find({}).toArray(function(err, result) {
            res.render('produtos/lista', {lista:result})
        });

        db.close();

    });
}

E quando acesso: http://localhost:3000/produtos, recebo o seguinte erro:

TypeError: mongodb.collection is not a function
    at c:\Dev\Alura\Javascript\Node\casadocodigo\app\routes\produtos.js:10:34
    at Layer.handle [as handle_request] (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at next (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)
    at c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\index.js:335:12)
    at next (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\index.js:275:10)
    at expressInit (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\middleware\init.js:40:5)
    at Layer.handle [as handle_request] (c:\Dev\Alura\Javascript\Node\casadocodigo\node_modules\express\lib\router\layer.js:95:5)

O erro eu até entendo, mais não estou conseguindo fazer de uma forma que funcione, já que não tenho experiência com javascript.

Será que alguém poderia me dar uma luz?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta
solução!

Fala cara... Acho q o problema aí é q o connect não tem retorno (void).

Pra agilizar, no meu caso usei a seguinte solução: Na config do Express setei:

api.set('URI_DB','mongodb://localhost:27017/<nome_da_base>');

E o DAO onde eu uso essa config ficou assim:

var mongo = require('mongodb').MongoClient;

function UsuarioDAO(api) {
    this._api = api;
    this._urlDB = api.get('URI_DB');
}

UsuarioDAO.prototype.lista = function(usuarios) {
    var retorno = [];
    mongo.connect(this._urlDB, (err, db) => {
        if(err) console.log('problema ao conectar na base de dados');

        var cursor = db.collection('usuarios').find();
        cursor.forEach((item, error) => {
            if(error) console.log(error);
            retorno.push(item);
        },
        endCalback => {
            usuarios(retorno);
            db.close();
        });     
    });
}


module.exports = function() {
    return UsuarioDAO;
}

Aí eu chamo esse metodo LISTA na minha config de rotas do Express:

api.get('/usuarios',function(req, res){
        var dao = new api.core.UsuarioDAO(api);
        dao.lista(lista => {
            res.json(lista);
            res.status(200);
        });
    });

Dessa maneira está funcionando... é uma pequena api rest em node + mongo, sendo consumida por um cliente angular... mas poderia ser qq outra coisa q entenda JSON.

Bom, é isso... espero ter ajudado.