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

erro express

Estou com problema na hora de debugar o express,

//// express.js

var express = require('express');
var load = require('express-load');

module.exports = function() {
    var app = express();   

   app.set('port', 3000);

   app.set('view engine', 'ejs');

    app.set('views', './app/views');

   app.use(express.static('./public'));

    load('models', {cwd: 'app'})
        .then('controllers')
        .then('routes')
        .into(app);

    return app;
}

// contato.js - routes

module.exports = function(app){
    var controller = app.controllers.contato;

    app.get('/contatos', controller.listaContatos);
    app.get('/contatos/:id', controller.obtemContato);
};

// contato.js - controllers

var contatos = [
    {_id: 01, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'},
    {_id: 02, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'},
    {_id: 03, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'}
]

module.exports = function(){
    var controlller = {};
    controlller.listaContatos = function(req, res){
        res.json(contatos);
    };
    return controlller;    

    controller.obtemContato = function(req, res){
        var idContato = req.params.id;
        var contato = contatos.filter(function(contato){
           return contato._id == idContato; 
        })[0];
        contato ?
            res.json(contato) :
            res.status(404).send('Contato não encontrado');
    };      
}

// erro ao debugar no terminal

λ node server                                                                      
C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express\lib\router\route.js:16
2                                                                                  
        throw new Error(msg);                                                      
        ^                                                                          

Error: Route.get() requires callback functions but got a [object Undefined]        
    at C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express\lib\router\rout
e.js:162:15                                                                        
    at Array.forEach (native)                                                      
    at Route.(anonymous function) [as get] (C:\Users\desenvolvimento_1\Desktop\MEAN
\node_modules\express\lib\router\route.js:158:15)                                  
    at Function.app.(anonymous function) [as get] (C:\Users\desenvolvimento_1\Deskt
op\MEAN\node_modules\express\lib\application.js:421:19)                            
    at Object.module.exports (C:\Users\desenvolvimento_1\Desktop\MEAN\app\routes\co
ntato.js:5:9)                                                                      
    at C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express-load\lib\expres
s-load.js:247:19                                                                   
    at iterate (C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\async\lib\asyn
c.js:131:13)                                                                       
    at C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\async\lib\async.js:142:
25                                                                                 
    at C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express-load\lib\expres
s-load.js:263:7                                                                    
    at iterate (C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\async\lib\asyn
c.js:131:13)
9 respostas

Oi Glauber, experimenta colocar o return no seu contatos.js controller só no final? Dessa forma, ele só está retornando o callback de apenas uma das rotas.

Glauber, há um return perdido no meio do seu módulo.

coloquei o return no final, como segue o código, mas agora ele me retorna outro erro.

var contatos = [
    {_id: 01, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'},
    {_id: 02, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'},
    {_id: 03, nome:'Glauber Funez', email:'glauber_funez@hotmail.com'}
]

module.exports = function(){
    var controlller = {};
    controlller.listaContatos = function(req, res){
        res.json(contatos);
    };     

    controller.obtemContato = function(req, res){
        var idContato = req.params.id;
        var contato = contatos.filter(function(contato){
           return contato._id == idContato; 
        })[0];
        contato ?
            res.json(contato) :
            res.status(404).send('Contato não encontrado');
    };

    return controlller;      
}

segue o erro do terminal

λ node server
C:\Users\desenvolvimento_1\Desktop\MEAN\app\controllers\contato.js:13
    controller.obtemContato = function(req, res){
    ^

ReferenceError: controller is not defined
    at Object.module.exports (C:\Users\desenvolvimento_1\Desktop\MEAN\app\controllers\contato.js:13:5)
    at C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express-load\lib\express-load.js:247:19
    at iterate (C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\async\lib\async.js:131:13)
    at Object.async.eachSeries (C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\async\lib\async.js:147:9)
    at ExpressLoad.into (C:\Users\desenvolvimento_1\Desktop\MEAN\node_modules\express-load\lib\express-load.js:230:9)
    at module.exports (C:\Users\desenvolvimento_1\Desktop\MEAN\config\express.js:24:10)
    at Object.<anonymous> (C:\Users\desenvolvimento_1\Desktop\MEAN\server.js:2:38)
    at Module._compile (module.js:409:26)
    at Object.Module._extensions..js (module.js:416:10)
    at Module.load (module.js:343:32)

Você está escrevendo o nome da variavel controller de duas formas, uma com dois l, e outra com três. veja:

 var controlller = {};
      controlller.listaContatos = function(req, res){ ... };     
      controller.obtemContato = function(req, res){... };
solução!

Tem erro de digitação. Verifique. Você usou 3 l no nome do controller.

A mensagem de erro é padrão do JavaScript, inclusive mostra a linha do erro. Ela indica o problema.

Explicando :se algo é undefined ou é porque você não declarou variável ou usou nome diferente da declaração.

A alura tem cursos inicias de JavaScript que podem ajuda-lo a pegar esse traquejo. Node é Javascript e os conceitos são aproveitados.

Po, verdade, nem me di conta nesse detalhe, obrigado, funcionou

Flávio, sei que é uma pergunta besta, já fiz javascript, mas não estou me lembrando o porque de usar no final da variavel o [0] exemplo que seguindo seu livro eu utilizo no final da váriavel abaixo, o resto entendi ta show, só fiquei curioso.

var contato = contatos.filter(function(contato){ return contato._id = idContato;  })[0];

Filter retorna uma lista e você quer apenas um item. Por isso passa a posição do array.

Muito Obrigado