#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. @Джо, большое тебе спасибо, я этого не видел!!!