0
votes

TypeError: User.findOne n'est pas une fonction

je crée un api nodejs, et je veux me connecter avec jwt, je crée déjà le modèle et la route, je le teste sur postman avec la méthode post, j'ai une collection appelée "user" sur mongodb mais quand j'envoie le message de pétition apparaît cette erreur `

schema.methods.isValid = function(hashedpassword){
    console.log(this.password)
    console.log(hashedpassword)
    var data = bcrypt.compareSync(hashedpassword, this.password);
    console.log(data)
    return bcrypt.compareSync(hashedpassword, this.password);
}

J'envoie le champ utilisateur et mot de passe sur le facteur

var mongoose= require('mongoose');
var Schema = mongoose.Schema;
var bcrypt = require('bcrypt');

var schema =  new Schema({
        username:{type:String, require:true},
        password:{type:String, require:true},
        //creation_dt:{type:String, require:true}
    },
);

schema.statics.hashPassword = function hashPassword(password){
    return bcrypt.hashSync(password, 10);
}

schema.methods.isValid = function(hashedpassword){
    return bcrypt.compareSync(hashedpassword, this.password);
}

module.exports = routeur;

c'est le modèle

                var express = require('express');
                var router = express.Router();
                var User = require('../models/user');
                var jwt = require('jsonwebtoken');

                router.post('/login', function(req, res, next) {

                    let promise= User.findOne({username:req.body.username}).exec();

                    promise.then(function(doc){
                        if(doc){
                            if(doc.isValid(req.body.password)){
                                let token = jwt.sign({username:doc.username}, 'secret', {expiresIn: '3h'});
                                return res.status(200).json(token);

                            }else{
                                return res.status(501).json({message: 'invalid credentials'});
                            }    
                        }else{
                            return res.status(501).json({message:'User email is not registered'})
                        }
                    });

                    promise.catch(function(err){
                        return res.status(501).json({message:'some internal error'})
                    })
                })

module.export = mongoose.model ('Utilisateur', schéma); je veux que la méthode post renvoie un jwt


c'est la méthode "isValid" à l'intérieur du modèle, comme vous pouvez le voir, j'ai un console.log () qui me montre la variable "this.password" et "hashedpassword", ces variables sont égales, et cette méthode doit renvoyer un boolean = true mais retourne "false", je ne comprends pas ce qui se passe:

TypeError: User.findOne is not a function
    at E:\AppAgricola\Proyecto\api\routes\loginRoutes.js:8:27
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:335:12)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:174:3)
    at router (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:317:13)
    at E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:335:12)
    at next (E:\AppAgricola\Proyecto\api\node_modules\express\lib\router\index.js:275:10)
    at app.use (E:\AppAgricola\Proyecto\api\app.js:27:5)`


6 commentaires

Cela dépendra de quoi et comment les valeurs sont exportées à partir de models/user.js Pouvez-vous également partager cet extrait?


Jonathan, j'ai déjà mis à jour le post


Peut-être une faute de frappe - module.exports pluriel vs singulier dans user.js


mais c'est comme "utilisateur" dans le modèle, "utilisateur" dans les routes et "utilisateur" dans la collection mongodb


Je veux dire l'orthographe des exports elle-même. users.js affecte l' export plutôt que les exports , créant une nouvelle propriété qui n'est pas transmise par Node.


merci Jonathan, c'était une erreur, mais en ce moment, quand je teste avec le facteur la méthode "isValid" return "false", je vais mettre à jour le message pour que vous puissiez mieux paraître


4 Réponses :


0
votes

module.export = mongoose.model('User', schema); n'exporte rien.

L'export Node.js (pas ES6) est:

module.exports = ...;

Quelle que soit la valeur de retour de la fonction "require", quelle qu'elle soit au niveau des points triples.


1 commentaires

mais j'ai un autre modèle et cela fonctionne, avec: module.export = mongoose.model ('User', insumoSchema); .... schema est une variable où se trouve le modèle comme insumoSchema



0
votes

Assurez-vous que l'exportation est correcte.

C'est ce qui a fonctionné pour moi:

module.exports = User = mongoose.model('users', UserSchema);


0 commentaires

-1
votes

Utilisez simplement console.log(module.exports) comme si:

module.exports=User=mongoose.model('User',Schema);

s'il imprime le schéma, alors il fonctionne et de plus, le problème réside uniquement dans le module.exports .


0 commentaires

0
votes

Dans mon cas, j'ai dû changer

import User from '../../models/User'; (qui a été ajouté automatiquement aux importations par VSCode)

à const User = require('../../models').users;

J'espère que cela aide les gens avec un cas similaire.


0 commentaires