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

Erro ao registrar o model User no mongoose

Olá!

Estou tendo problemas em utilizar o model de users criado na pasta models na api de auth. Segue o erro apresentado:

C:\biwebapp\node_modules\mongoose\lib\index.js:364
      throw new mongoose.Error.MissingSchemaError(name);
      ^
MissingSchemaError: Schema hasn't been registered for model "User".
Use mongoose.model(name, schema)

E aqui tenho o meu model:

var mongoose = require('mongoose');

var schema = mongoose.Schema({
    username : {
        type : String,
        required : true
    },
    password : {
        type : String,
        required : true
    },
    accessType : {
        type : String,
        required : true
    }
});

mongoose.model('User', schema);

O meu route:

module.exports = function(app){
    var api = app.app.api.auth;

    app.post('/authenticate', api.auth);
    app.use('/*', api.tokenVerify);
}

E minha API:

var mongoose = require('mongoose');
var jwt = require('jsonwebtoken');

module.exports = function(app) {

    var api = {};
    var model = mongoose.model('User');

    api.auth = function(req,res){
        model.findOne({
            username : req.body.username, 
            password : req.body.password
        })
        .then(function(user){
            if(!user){
                console.log('Usuário e Senha inválidos!');
                res.sendStatus(401);
            } else {
                console.log(user.username)
                var token = jwt.sign({username : user.username}, app.get('secret'), {
                    expiresIn: 84600
                });
                console.log('Token criado e sendo enviado no header de requisicao');
                res.set('X-NW-Token',token);
                res.end();
            }
        });
    };

    api.tokenVerify = function(req, res, next) {
        var token = req.headers['X-NW-Token'];
        if(token) {
            console.log('Verificando Token...');
            jwt.verify(token, app.get('secret'), function(error,decoded) {
                if(error){
                    console.log('Token Rejeitado!');
                    return res.sendStatus(401);
                } else {
                console.log('Token aceito');
                req.user = decoded;
                next();
                }
            });
        } else {
            console.log('Token não foi enviado');
            return res.sendStatus(401);
        }
    };

    return api;
};
3 respostas
solução!

Seu model precisa ser carregado antes de ser usado. Por isso mongoose indica que ele não existe.

Há uma parte do código que ele carrega automaticamente todos os arquivos dentro da pasta models. Talvez você tenha pulado, pois não vejo no seu código. É na parte do consign!


consign({cwd: 'app'})
    .include('models')
    .then('api')
    .then('routes')
    .into(app);

Você faz isso na aula

https://cursos.alura.com.br/course/mean-javascript/task/13694

Era exatamente isso Professor!

Eu achei que para o consign, era necessário carregar as pastas na ordem de criação, por isso que acabei fazendo daquela forma.

Muito obrigado!

Excelente! Sucesso e bom estudo Raphael!