Problema quanto Às Rotas e Controller no Nodejs

Olá pessoal, estou com um problema quanto à organização de rotas e controller. Por exemplo, onde coloco a lógica de programação? Dentro do diretório de rotas ou dentro do diretório de controllers? Outra coisa, eu estava colocando a lógica de programação dentro dos controllers e importando para dentro das rotas (para dentro dos arquivo de rotas, neste caso, pertencente a User.js), ficando mais ou menos assim:

Arquivo UsersController:

exports.userList = function (req, res) {
 	res.render("user/index");
};

Dentro do diretório de rotas, temos o arquivos users.js

const express = require('express');
const router = express.Router();
const user = require('../controllers/users/usersController');

router.get('/', user.userList());

module.exports = router;

Dentro do entry point, index.js, temos a importação:

const user = require('./routes/user');
app.use('/user', user);

Agora vem o erro quando inicio o server:

C:\Users\Geraldo\Documents\jobOverflow\controllers\users\usersController.js:78
        res.render("user/index");
            ^

TypeError: Cannot read property 'render' of undefined
    at Object.exports.userList (C:\Users\Geraldo\Documents\jobOverflow\controllers\users\usersController.js:78:6)
    at Object.<anonymous> (C:\Users\Geraldo\Documents\jobOverflow\routes\user.js:5:22)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Module.require (internal/modules/cjs/loader.js:1025:19)
    at require (internal/modules/cjs/helpers.js:72:18)
    at Object.<anonymous> (C:\Users\Geraldo\Documents\jobOverflow\index.js:16:14)
    at Module._compile (internal/modules/cjs/loader.js:1137:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
    at Module.load (internal/modules/cjs/loader.js:985:32)
    at Function.Module._load (internal/modules/cjs/loader.js:878:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
    at internal/main/run_main_module.js:17:47
[nodemon] app crashed - waiting for file changes before starting...

Acredito que o problema seja pq vc está invocando a função no momento em que está criando a rota:

router.get('/', user.userList());

Em vez disso, tente assim:

router.get('/', user.userList);

que é o mesmo que:

router.get('/', function (req, res) {
	res.render("user/index");
});

Acho essa última parte a melhor opção, pois vc mantém o código que será executado junto com a declaração da rota. Mas, mesmo assim, se vc quiser manter num arquivo separado, vc pode alterar o export para ficar assim:

exports.userList = function() {
    return function (req, res) {
        res.render("user/index");
    }
};
1 curtida

Meu grande amigo, meu muito obrigado pela ajuda. Eu consegui resolver, porém de uma maneira diferente (não fugiu muito do que você disse), mas vou deixá-la aqui, uma vez que poderá ajudar outras pessoas.

No controller, fiz assim:

let usersController = {
	userList: (req, res) => {
		res.render("user/index");
	}
    // Adding another functions ...
}

module.exports = usersController;

E nas rotas

router.get('/', user.userList);

Nesta última é exatamente o que você me disse. Meu muito Obriiigadooooo @Lucas_Camara! Que Deus te abençoe.

1 curtida

Gostei da solução que vc usou.

1 curtida