在檔案夾backend/controllers我有一個authController類,它處理帶有電子郵件和密碼的 POST 請求,然后在資料庫中查找具有匹配電子郵件的用戶,然后當它找到用戶時,它會嘗試驗證密碼呼叫名為comparePassword的方法,在位于backend/models的用戶類中定義。
authController 類:
const User = require('../models/user');
const ErrorHandler = require('../utils/errorHandler');
const catchAsynErrors = require('../middlewares/catchAsyncErrors');
const sendToken = require('../utils/jwtToken');
// register user => /api/v1/register
exports.registerUser = catchAsynErrors(async (req, res, next)=> {
const { name, email, password} = req.body;
const user = await User.create({
name,
email,
password,
avatar: {
public_id: '',
url: ''
}
})
sendToken(user, 200, res)
})
// login user => /a[i/v1/login
exports.loginUser = catchAsynErrors(async(req, res, next)=> {
const { email, password} = req.body;
// checks if email and password is entered by the user
if(!email || !password){
return next(new ErrorHandler('Please enter email & password', 400))
}
//finding user in database
const user = await User.find( { email } ).select(' password')
if(!user){
return next(new ErrorHandler('Invalid Email or Password', 401))
}
// Attempting to print the user object's functions
console.log(user.comparePassword); // undefined
console.log(user.find); // [Function: find]
//checks if password is correct or not
const isPasswordMatched = await user.comparePassword(password);
if(!isPasswordMatched){
return next(new ErrorHandler('Invalid Email or Password', 401))
}
sendToken(user, 200, res)
});
用戶類:
const mongoose = require('mongoose');
const validator = require('validator');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const userSchema = new mongoose.Schema({
name: {
type: String,
required: [true, 'Please enter your name'],
maxLenght: [30, 'Your name cannot 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'],
minlenght: [6, 'Your password must have at least 6 characters'],
select: false
},
avatar:{
public_id: {
type: String,
required: true
},
url:{
type: String,
required: true
}
},
role:{
type: String,
default: 'user'
},
createdAt:{
type: Date,
default: Date.now
},
resetPasswordToken: String,
resetPasswordExpire: Date
})
//encrypting password before saving user
userSchema.pre('save', async function (next){
if(!this.isModified('password')){
next()
}
this.password = await bcrypt.hash(this.password, 10)
})
// compare user password
userSchema.methods.comparePassword = async function (enteredPassword) {
return await bcrypt.compare(enteredPassword, this.password)
}
// return jwt token
userSchema.methods.getJwtToken = function (){
return jwt.sign({ id: this._id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_TIME
});
}
module.exports = mongoose.model('User', userSchema);
這是我嘗試使用Postman發出 POST 請求時得到的結果 ,以及控制臺(在本例中,通過 VS Code 終端)在嘗試 console.log 函式時顯示的結果 comparePassword 和函式 find ,兩者屬于同一類。
郵差:
{
"success": false,
"error": {
"statusCode": 500
},
"errMessage": "user.comparePassword is not a function",
"stack": "TypeError: user.comparePassword is not a function\n at D:\\pruebas de programación\\Proyectazo\\backend\\controllers\\authController.js:47:42\n at processTicksAndRejections (node:internal/process/task_queues:96:5)"
}
安慰:
PS D:\pruebas de programación\Proyectazo> npm run dev
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
> proyectazo@1.0.0 dev
> SET NODE_ENV=DEVELOPMENT& nodemon backend/server
[nodemon] 2.0.19
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node backend/server.js`
Server started on PORT: 4000 in DEVELOPMENT mode.
MongoDB Database connected with HOST: localhost
undefined
[Function: find]
我已經按照本教程https://www.youtube.com/watch?v=_zXBZS6E-jM&list=PLkVd4_IMjZgkwcXwnpy7tenGNBbRdiRO8&index=27做到了這一點,它似乎在視頻中完美運行。我查找了其他解決方案,其中一些甚至在 StackOverflow 中,它們看起來都像我所擁有的相同實作的變體或重構。有任何想法嗎?
提前致謝!
uj5u.com熱心網友回復:
它不起作用的原因是因為在 loginUser 函式中
//finding user in database
const user = await User.find( { email } ).select(' password')
user
是一個陣列。而是使用 Use.findOne() 方法
// This will return single user object
const user = await User.findOne( { email } ).select(' password')
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/507659.html
標籤:javascript 节点.js 表示 验证 后端
上一篇:無法從快遞中獲取資料做出反應