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); }
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)`
4 Réponses :
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.
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
Assurez-vous que l'exportation est correcte.
C'est ce qui a fonctionné pour moi:
module.exports = User = mongoose.model('users', UserSchema);
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
.
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.
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 dansuser.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 lesexports
, 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