Error, no post/get, node js e sequelize

Olá estou com o seguinte error, e não faço ideia por qual motivo:

TypeError: Cannot read property 'create' of undefined at UsersController.create (C:\Users\SpiriT\Documents\ProjetoWEB\backend\src\controllers\users.js:24:18) at C:\Users\SpiriT\Documents\ProjetoWEB\backend\src\routes\users.js:22:18

nesses 2 arquivos:

controllers\users.js :

const HttpStatus = require('http-status');

class UsersController {
    
    constructor(modelUser){
        this.Users = modelUser;
    }

    getAll(){
        return this.Users
            .findAll({})
            .then(rs => rs)
            .catch(e => e);
    }
    getById(params){
        return this.Users
                .findOne({where:params})
                .then(rs=>rs)
                .catch(e=>e);
    }

    create(data){
        return this.Users
                .create(data)
                .then(rs=>rs)
                .catch(e=>e);
    }

    update(data,params){
        return this.Users
            .update(data, {where: params})
            .then(rs=>rs)
            .catch(e=>e);
    }

    delete(params){
        return this.Users
                .destroy({where:params})
                .then(rs=>rs)
                .catch(e=>e);
    }

}

module.exports = UsersController;

routes users.js:

const UsersController = require('../controllers/users')

module.exports = (app) => {

    const usersController = new UsersController(app.datasource.models.users);

    app.route('/users')
        .get((req,res)=>{
            usersController
                .getAll()
                .then(data => {
                    res.json(data);
                })
                .catch(error=>{
                    console.log(error);
                    res.status(400);
                });

        })
        .post((req,res)=>{
            usersController
                .create(req.body)
                .then(rs=>{
                    res.json(rs);
                    res.status(201);
                })
                .catch(error=>{
                    console.log(error) 
                    res.status(422);   
                });
        });

};

Dá um console.log(modelUser) !!! O que imprime.

ta dando que ele não está definido : ReferenceError: modelUser is not defined

Se não está passando nada então! deve estar errado o jeito que você organizou.

1 curtida

Eu procurei bastante e não sei onde errei:

Meu model :

module.exports = (sequelize, DataType) => {

    const User = sequelize.define('tb_users', {
        id: {
            type: DataType.INTEGER,
            primaryKey:true,
            autoIncrement: true
        },
        name: {
            type: DataType.STRING,
            allowNull: false,
            validate: {
                notEmpty: true
            }
        },
        email: {
            type: DataType.STRING,
            allowNull: false,
            unique:true,
            validate: {
                isEmail: true,
                notEmpty: true
            }
        },
        password: {
            type: DataType.STRING,
            allowNull: false,
            validate: {
                notEmpty: true
            }
        }
    });

    return User;

}; 

meu router:

const UsersController = require('../controllers/users')

module.exports = (app) => {

    const usersController = new UsersController(app.datasource.models.users);

    app.route('/users')
        .get((req,res)=>{
            usersController
                .getAll()
                .then(data => {
                    res.json(data);
                })
                .catch(error=>{
                    console.log(error);
                    res.status(400);
                });

        })
        .post((req,res)=>{
            usersController
                .create(req.body)
                .then(rs=>{
                    res.json(rs);
                    res.status(201);
                })
                .catch(error=>{
                    console.log(error) 
                    res.status(422);   
                });
        });

};

e o meu controller:

const HttpStatus = require('http-status');

class UsersController {
    
    constructor(modelUser){
        this.Users = modelUser;
    }

    getAll(){
        return this.Users
            .findAll({})
            .then(rs => rs)
            .catch(e => e);
    }
    getById(params){
        return this.Users
                .findOne({where:params})
                .then(rs=>rs)
                .catch(e=>e);
    }

    create(data){
        console.log('fuaehfu')
        console.log('user',modelUser);
        return this.Users
                .create(data)
                .then(rs=>rs)
                .catch(e=>e);
    }

    update(data,params){
        return this.Users
            .update(data, {where: params})
            .then(rs=>rs)
            .catch(e=>e);
    }

    delete(params){
        return this.Users
                .destroy({where:params})
                .then(rs=>rs)
                .catch(e=>e);
    }

}

module.exports = UsersController;

mas, falta também dizer aonde você exportou a parte do (app)?

acho que seria isso?:

const express = require('express');

const bodyParser = require('body-parser');

const indexRouter = require('./routes/index');

const usersRouter = require('./routes/users');

const config = require('./config/config');

const datasource = require('./config/datasource');

const app = express();

const port = 3000;

app.set('port',port);

app.config = config;

app.datasource = datasource(app);

console.log(app.config);

app.use(bodyParser.json({

limit: '5mb'

}));

indexRouter(app);

usersRouter(app);

module.exports = app;
usersRouter(app);

Dá uma olhada nisso, ve se abre para passar o app! eu acho que se não passou o app para as routes

como eu faria isso? Debugando? Eu debuguei e foi para o routers

complicado… porque para mim seria:

const express = require('express');
const config = require('./config/config');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;
app.set('port',port);
app.config = config;

const indexRouter = require('./routes/index')(app);
const usersRouter = require('./routes/users')(app);
const datasource = require('./config/datasource');

app.datasource = datasource(app);

app.use(bodyParser.json({
	limit: '5mb'
}));
1 curtida

O meu está assim:

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const todosRouter = require('./routers/todos-routers');
const usersRouter = require('./routers/users-routers');
const authRouter = require('./routers/auths-routers');
/*
* Express Server Http
*/
const app = express();
const port = process.env.PORT || 8080;

/*
* Routers Configuration
*/
const router = express.Router();
todosRouter.configuration(router);
usersRouter.configuration(router);
authRouter.configuration(router);
/*
* Middleware
*/
// const corsOptions = {
//     origin: true,
//     optionsSuccessStatus: 200
// }
app.use(cors());
app.options('*', cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use('/', router);
app.get('/', async (req, res) => {
    res.sendFile(__dirname + '/public/index.html');
})

/*
* Listen
*/
app.listen(port, () => {
    console.log(`Servidor rodando em http://localhost:${port}`)
    console.log('Para derrubar o servidor: ctrl + c');
});

Rota Exemplo:

const bcrypt = require('bcrypt');

const usersModel = require('../models/users-model');
const jwt = require('../middlewares/jwt-middleware');
const { salt } = require('../auth/index');

module.exports = {    
    configuration: (router) => {        
        router.get('/api/users', jwt, (req, res, next) => {                        
            usersModel.findAll()
                .then((result) => { res.json(result) })
                .catch((error) => { res.json(error) });
        });
        
        router.get('/api/user/:id?', jwt, (req, res, next) => {
            const id = parseInt(req.params.id);
            usersModel.findByPk(id)
                .then((result) => { res.json(result) })
                .catch((error) => { res.json(error) });
        });
        
        router.post('/api/user', jwt, async (req, res, next) => {
            const name = req.body.name;
            const email = req.body.email;
            const password = bcrypt.hashSync(req.body.password, salt.value);
            const app_id = req.body.app_id || null;
            const active = parseInt(req.body.active) || 0;
            const data = {
                name,
                email,
                password,
                app_id,
                active
            };            
            usersModel.create(data)
            .then((result) => { res.json(result) })
            .catch((error) => { res.json(error) });
        });
        
        router.put('/api/user/:id?', jwt, async (req, res, next) => {
            const name = req.body.name;
            const email = req.body.email;
            let password = req.body.password;
            const app_id = req.body.app_id || null;
            const active = parseInt(req.body.active) || 0;
            const id = parseInt(req.params.id); 
            let data = {
                name,
                email,
                password,
                app_id,
                active
            };
            if (password) {
                data.password = bcrypt.hashSync(req.body.password, salt.value);
            } else {
                delete data.password;
            }
            usersModel.update(data, {
                where: { 
                    id
                }
            })
            .then((result) => { res.json(result) })
            .catch((error) => { res.json(error) });
        });
        
        router.delete('/api/user/:id?', jwt, (req, res, next) => {
            const id = parseInt(req.params.id);
            usersModel.destroy({
                where: {
                    id
                }
            })
            .then((result) => { res.json(result) })
            .catch((error) => { res.json(error) });
        });
    }
}
1 curtida

vlw man vou tentar fazer algo com essa rota e app,

então no caso você não fez um arquivo controller’s fez tudo já no routers ?

e essa todosRouter você poderia me mostrar?

1 curtida

todosRouter é igual ao userRouter, nesse caso não separei com controller

1 curtida