Почему я получаю эту ошибку, связанную с тем, что объект Мангуста не является функцией?

#javascript #node.js #mongodb #mongoose

#язык JavaScript #node.js #mongodb #мангуст

Вопрос:

Я создаю это приложение для электронной коммерции с использованием стека MERN, и я нахожусь в процессе создания аутентификации для пользователя, и я использую JWT, я создал конечную точку API входа в систему, но я не хочу хранить токен в локальном хранилище, поэтому я создал файл cookie и храню токен там. Когда я тестирую конечную точку входа с помощью postman, я получаю эту ошибку: «user.getJwtToken не является функцией». Я вставил свой код ниже, я не знаю, где я совершаю ошибку…

 Model: User.js  import mongoose from 'mongoose'; import validator from 'validator'; import bcrypt from 'bcryptjs'; import jwt from 'jsonwebtoken';  const userSchema = new mongoose.Schema({  name: {  type: String,  required: [true, 'Please enter your name'],  maxlength: [30, 'Name can not exceed 30 characters']  },  email: {  type: String,  required: [true, 'Please enter your email'],  unique: true,  validate: [validator.isEmail, 'Please enter a valid email address']  },  password: {  type: String,  required: [true, 'Please enter your password'],  minlength: [6, 'Password must be longer than 6 characters'],  select: false  },  avatar: {  public_id: {  type: String,  required: true  },  url: {  type: String,  required: true  }  },  role: {  type: String,  default: 'user'  },  resetPasswordToken: String,  resetPasswordExpire: Date }, {  timestamps: true })  userSchema.pre('save', async function(next){  if (!this.isModified('password')){  next()  }   this.password = await bcrypt.hash(this.password, 10) })   userSchema.methods.matchPassword = async function(enteredPassword){  return await bcrypt.compare(enteredPassword, this.password); }  userSchema.methods.getJwtToken = function(){  return jwt.sign({ id: this._id}, process.env.JWT_SECRET, {  expiresIn: process.env.JWT_EXPIRES_TIME  }) }  const User = mongoose.model('User', userSchema);  export default User;  
 jwtToken.js  const sendToken = (res, statusCode, user) =gt; {  const token = user.getJwtToken();   const options = {  expires: new Date(  Date.now()   process.env.COOKIE_EXPIRES_TIME * 24 * 60 * 60 * 1000  ),  httpOnly: true  }   res.status(statusCode).cookie('token', token, options).json({  success: true,  token,  user  }) }  export default sendToken;  
 User controller: authController.js  import User from '../models/User.js'; import asyncHandler from 'express-async-handler'; import sendToken from '../utils/jwtToken.js';  export const registerUser = asyncHandler(async (req, res, next) =gt; {  const { name, email, password } = req.body;  const userExists = await User.findOne({ email });   if(userExists){  res.status(400);  throw new Error('User already exists');  }   const user = await User.create({  name,   email,   password,  avatar: {  public_id: 'users/ejoka_sxbax2',  url: 'https://res.cloudinary.com/ejoka/image/upload/v1638139726/users/ejoka_sxbax2.jpg'  }  });   sendToken(user, 200, res)  })  // Login User /api/v1/login  export const loginUser = asyncHandler( async(req, res, next) =gt; {  const { email, password } = req.body;   if(!email || !password){  res.status(400);  throw new Error('Please enter email and password')  }   const user = await User.findOne({email}).select(' password');   if(!user){  res.status(401);  throw new Error('Invalid email or password')  }   const isPasswordMatched = await user.matchPassword(password)   if(!isPasswordMatched){  res.status(401);  throw new Error('Invalid email or password');  }   sendToken(user, 200, res);  })   
  Route: auth.js  import express from 'express'; import { loginUser, registerUser } from '../controllers/authControllers.js';  const router = express.Router();  router.post('/register', registerUser); router.post('/login', loginUser);  export default router;    

Комментарии:

1. Можете ли вы опубликовать сообщение об ошибке?

2. @LucaDeAcha вот сообщение об ошибке: ` { «errMessage»: «user.getJwtToken не является функцией» } `

3. Похоже на опечатку: похоже, вы вызываете sendToken функцию с обратными аргументами.

4. @Джо, большое тебе спасибо, я этого не видел!!!