Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Arquitetura de uma app

Boa tarde, Estou desenvolvendo uma app com MEAN, muito embora esteja fazendo o meu server (somente API's) totalmente separado (em projetos diferentes) do client (Angular). No entanto, estou com uma dúvida. Tenho os seguintes diretórios no meu server: app/config/express.js - > Configurações do Express app/controllers -> Aqui defino a minhas controllers app/infra -> Conexão com o MongoDB app/models -> Definição dos Schemas app/route -> Definição das Rotas No curso, é utilizado a abordagem que o diretório api fica responsável pela lógica de requisições da app. Creio que seria algo parecido com o diretório controllers que utilizo na minha abordagem. No entanto, tenho algumas dúvidas em qual abordagem devo seguir. Veja alguns exemplos de códigos que utilizo no meu contexto: app/controllers/usuario.js

var Usuario = require('../models/usuario');
...
exports.save = function(usuario, callback){
        var usuario = new Usuario(usuario);
        usuario.save(function(err, data){
            if(err){
                callback('Não foi possível adicionar o usuário');
            }else{
                callback(null, data);
            }
        });
    }

app/models/usuario.js :

var mongoose = require('mongoose');

var UsuarioSchema = new Schema({

    nome: {
        type: String,
        unique: true,
        required: true
    },
    senha: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    }
});
module.exports = mongoose.model('Usuario', UsuarioSchema);

app/routes/usuario.js :

var cors = require('cors');
module.exports = function(app){

    app.use(cors());

    var usuarioController = app.controllers.usuario;

    app.post('/usuario/cadastra', function(req, res){
        if(!req.body.nome || !req.body.senha){
            res.json('Por favor informe um usuário e uma senha');
        }
        else{
            var usuario = req.body;
            usuarioController.save(usuario, function(err, resp){
                if(err) return res.status(500).send(err);
                res.status(200).json(resp);
            });
        }
    });
...
}

Utilizando dessa forma? Eu consigo melhor separar as coisas? Em questão de manutenção do código, é legal fazer dessa forma? Desempenho?

2 respostas
solução!

Eu só chamaria controller de API, porque você não tem controllers. Controller no server renderizam como resposta uma view e você só disponibiliza dados.

Só um ponto. Em routes.js você não deveria ter nenhuma lógica, apenas declarar as rotas da app e importar a API para usar os métodos da API para lidar com request e response. Ou seja, fazer como ensino no treinamento.

Outra coisa estranha é que em routes.js seu controller não é um controller, é seu modelo do Mongoose! O modelo do mongoose deve ser usado dentro de uma API (no seu controller, se quiser chamar assim).

routes -> depende de API -> API depende de modelo.

Eu proponho essa divisão no curso. Você fez o curso de MEAN da Alura?

Muito Obrigado, Flavio! Eu na verdade acompanhei seu curso do Angular 2, e já vi por alto algumas coisas do Curso de MEAN. Mas muito antes (assim que conclui o curso de Angular 2 ministrado por você, comecei a montar algumas peças e tentar fazer o Server). Mas, obrigado pelas dicas, irei ajustar agora meu projeto e acompanhar mais fielmente o curso de MEAN. Valeu!!