विधि एक समारोह नहीं है Mongoose तरीके समस्या
ENV:
नोड v12.19.0
मोंगो एटलस V4.2.11
मोनगोज V5.11.8
#############################################
मेरे पास एक उपयोगकर्ता स्कीमा है
user.js
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');
const userSchema = new mongoose.Schema({
email:{
type: String,
required: true,
unique: true,
},
username:{
type: String,
required: true,
unique: true,
},
password:{
type: String,
required: true
},
profileImageUrl:{
type: String,
}
});
userSchema.pre('save', async function(next) {
try{
if(!this.isModified('password')){
return next();
}
let hashedPassword = await bcrypt.hash(this.password, 10);
this.password = hashedPassword;
return next();
} catch(err) {
return next(err);
}
});
userSchema.methods.comparePassword = async function(candidatePassword){
try{
return await bcrypt.compare(candidatePassword, this.password);
} catch(err){
throw new Error(err.message);
}
}
userSchema.set('timestamps', true);
module.exports = mongoose.model("User", userSchema);
मैं जाँच कर रहा हूँ कि यदि पासवर्ड संशोधित नहीं है तो मैं इसे पूर्व बचत में संशोधित करता हूँ।
और मैंने पासवर्ड की तुलना हैशेड पासवर्ड के साथ तुलना करने के लिए एक विधि जोड़ी है जिसे तुलनाप्रासवर्ड कहा जाता है
मैं अन्य फ़ाइल में ComparPassword विधि का उपयोग करने का प्रयास कर रहा हूं
प्रामाणिक .js
const db = require('../models');
const JWT = require("jsonwebtoken");
const CONFIGS = require('../config');
exports.signIn = async function(req, res, next){
try{
const user = db.User.findOne({
email: req.body.email,
});
const { id, username, profileImageUrl } = user;
const isMatch = await user.comparePassword(req.body.password) ; // here is a problem <====
if(isMatch){
const token = JWT.sign({
id,
username,
profileImageUrl,
}, CONFIGS.SECRET_KEY);
return res.status(200).json({
id,
username,
profileImageUrl,
token,
});
}
else{
return next({
status: 400,
message: "Invalid email or password",
});
}
}
catch(err){
return next(err);
}
}
जब मैं पूर्वनिर्धारित विधि के साथ पासवर्ड की तुलना करने की कोशिश करता हूं तो यह प्रतिक्रिया में इसे वापस करता है
user.comparePassword एक फ़ंक्शन नहीं है
मैंने विभिन्न समाधानों को देखा।
कुछ ने कहा कि यह उनके लिए काम करता है:
userSchema.method('comparePassword' , async function(candidatePassword, next){
// the logic
})
लेकिन यह काम नहीं करता है मैंने विभिन्न समाधानों की भी कोशिश की, लेकिन मुझे यकीन नहीं है कि कोड के साथ क्या गलत है।
अपडेट 1:
मैंने स्टैटिक्स का उपयोग करने की कोशिश की और यह काम नहीं करता है
userSchema.statics.comparePassword = async function(candidatePassword){
try{
return await bcrypt.compare(candidatePassword, this.password);
} catch(err){
throw new Error(err.message);
}
}
जवाब
में Auth.js
const user = db.User.findOne({
email: req.body.email,
});
यह गलत है क्योंकि हमें क्वेरी समाप्त होने तक प्रतीक्षा करनी चाहिए;
यह इस तरह होना चाहिए
const user = await db.User.findOne({
email: req.body.email,
});