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?

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.