سلام،
من تازه دوره "ساخت یک وبسایت آموزشی (فروشگاهی) با Nodejs" رو شروع کردم و دارم با جلسات پیش میرم و پروژه اون رو با کمی تغییرات اجرا میکنم. متاسفانه به دلیل اینکه دوره قدیمی هست نسخه استفاده شده برخی پکیج ها ی این دوره منسوخ شدن یا اینکه dependency های اونها منسوخ شدن . من تا جلسه هفتم پیش رفتم و همه مشکلات رو با جستجو حل کردم. اما در بخش ثبت نام کاربر به دلیل تغییرات نسخه های جدید پکیج mongoose به مشکل خوردم و متاسفانه با جستجو در گوگل و استک اورفلو به جوابی نرسیدم که بتونم اون رو درک کنم. خواستم با نسخه mongoose استفاده شده در دوره و چند نسخه بعد از اون پیش برم اما تعداد زیادی از dependency های اونها منسوخ شدن و دیگه قابل نصب نیستن و در نصب ارور های زیادی میدن. گفتم اینجا بپرسم شاید دوستان بتونن من رو راهنمایی کنن
const passport = require('passport')
const localStrategy = require('passport-local').Strategy
const User = require('app/models/user')
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function (err, user) {
done(err, user);
});
});
passport.use('local.register' , new localStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
} , (req , email , password , done) => {
console.log(email , password)
User.findOne({ 'email' : email } , (err , user) => {
if(err) return done(err);
if(user) return done(null , false , req.flash('errors' , 'چنین کاربری قبلا در سایت ثبت نام کرده است!'));
const newUser = new User({
name : req.body.name,
email,
mobile: req.body.mobile,
password
});
newUser.save(err => {
if(err) return done(err , false , req.flash('errors' , ' در فرایند ثبت نام خطایی رخ داده لطفاً مجدداً سعی کنید!'));
done(null , newUser);
})
})
}))
وقتی فرم ثبت نام رو ارسال میکنم ارور "MongooseError: Model.findOne() no longer accepts a callback
at Function.findOne " رو دریافت میکنم . ظاهراً در متدهای نسخه های جدید mongoose نمیشه از کال بک فانکشن ها استفاده کرد . لطفاً اگر کسی در مورد این مشکل میدونه من رو راهنمایی کنه. پیشاپیش از وقتی که میگذارید تشکر میکنم.
این مشکل رو به صورت زیر رفع کردم:
const passport = require('passport')
const localStrategy = require('passport-local').Strategy
const User = require('app/models/user')
passport.serializeUser(function(user, done) {
done(null, user._id)
})
passport.deserializeUser( async function(_id, done) {
await User.findById(_id).then((user, err)=>{
done(err, user)
})
})
passport.use('local.register' , new localStrategy({
usernameField : 'email',
passwordField : 'password',
passReqToCallback : true
} , async (req , email , password , done) => {
console.log(email , password)
await User.findOne({ 'email' : email }).then((err , user) => {
try {
if(err || user) return done(null , false , req.flash('errors' , 'حساب کاربری با این ایمیل قبلاً ایجاد شده است!'))
const newUser = new User({
name : req.body.name,
email,
mobile : req.body.mobile,
password
})
newUser.save().then(() => done(null , newUser))
} catch (err) {
if(err) return done(err , false , req.flash('errors' , 'متاسفانه در فرایند ثبت نام خطایی رخ داده، لطفاً دوباره تلاش کنید!'))
}
})
}))
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟