سلام،
دوستان من یه کد دارم میخوام خط به خط لود بشه به طوری که قبل از اینکه خط اول لود نشده نره سراغ خط دوم و غیره
try{
await Authentication();
setLangName(user.language)
const getData = await getDataLang({ langName });
setLangText(getData);
setLoading(false);
}
catch(e){
toast.error('خطایی رخ داده است لطفاً بعدا تلاش کنید')
setLoading(false);
}
اما هر بار که تست میگیرم سریع پشت سر هم کد ها اجرا میشه
ممنون میشم راهکاری بهم یاد بدید
تا جایی که من میدونم جاوا اسکریپت کد ها از بالا به پایین اجرا میکنه .
شما وقتی از دستور await
استفاده کنی جاوا اسکریپت اونو پردازش میکنه ولی منتظر جوابش نمیمونه ، وقتی جوابش اومد ، جواب ارسال میکنه . یکی از دلیل هایی که میگن node js خیلی سریع همین async
و await
هستش.
میشه سناریویی که تو ذهنت داری توضیح بدی. برای چرا میخوای جاوا اسکریپت برای کدی که هنوز جوابش نیومده الاف کنی 😄؟
😂😂
یه پنل مشتری نوشتم و قبل از لود صفحه یه لایه ایجاد کرده به وسیله اون لایه، ابتدا، لاگین بودن یوزر رو بررسی کنه، بعد اجازه ورود بده
یوزری که لاگین هست اطلاعاتش اعم نام و..... و زبانی که موقع ثبت نام انتخاب کرده رو به وسیله ای پی آی برمیگردونم تو کد هام و با توجه به این اطلاعات بقیه صفحه مثل زبان نوشتاری سایت و امکاناتی که اون یوزر میتونه بهش دسترسی داشته باشه رو رندر میکنه
حالا چون هنوز اعتبار سنجی تموم نشده میره خط بعدی و چون زبانش مشخص نیست کد ها خطا میگیرن
روش بهتری به ذهنم نرسید اگه روش بهتری بهم معرفی کنی که فوق العاده میشه، اونوقت هم روش جدید یاد گرفتم هم از این چالش خلاص شدم 😀
خب چرا هر کدوم از اعتبارسنجی ها رو در قالب یک middleware
وارد نمیکنی
یک middleware
برای اینکه کاربر لاگین هستش
class redirectIfNotAuthenticated{
handel(req, res, next) {
if (req.isAuthenticated())
return next();
return res.redirect('/auth/login')
}
}
module.exports = new redirectIfNotAuthenticated();
من از کد بالا برای اینکه ببینم کاربر لاگین هستش استفاده میکنم
حالا توی روتی که برای پنل مشتری نوشتم اونو فراخوانی میکنم
const express = require('express');
const routes = express.Router();
routes.get('/panel',redirectIfNotAuthenticated.handel,"تو اینجا باید کنترل و متتد که مدنظر هست وارد کنی یا از یک کالبک فانکشن استفاده کنی ")
مشخص کردن زبانم به همین شکله شما بیا یک middleware
ایجاد کن و توی روت مورد نظرت قرار بده
مثال
routes.get('/panel',redirectIfNotAuthenticated.handel,setLang.handel,userController.index)
ممنونم مشکل من اینجاست که دارم از nodeJs به عنوان بک اند استفاده میکنم و از ریکت به عنوان فرانت
برای اعتبار سنجی، توکن ذخیره شده تو لوکال استوریج رو میفرستم سرور و پاسخش که حاوی اطلاعات یوزر هست رو دریافت میکنم
شما اطلاعات کاربر میتونی به صورت hash داخل رشته jwt قرار بدی و سمت فرانت اند با پکیج jwt-decode
این رشته decode کنی و توی localstorage ذخیره کنی تا دیگه درخواست به سمت سرور ارسال نکنی تا اطلاعات کاربر بگیری
حقیقتش من با react کار نکردم
ولی اینکارو با vue انجام دادم و با vuex
مشخص میکنم که رشته jwt اعتبار لازم داره یا نه
برای react هم باید همچین پکیجی باشه که state ها mutations تعریف کرد
واقعاً معرفی این پکیج عالی بود
من سعی فقط نام و ایمیل فرد رو تو توکن ذخیره کنم و برای مابقی اطلاعات مجبوره به دیتابیس وصل شم
برای این موضوع، راه حلی دارید بتونم انجام بدم یا پیشنهاد میدید اطلاعات ذخیره شده تو توکن رو افزایش بدم؟
اگه با اضافه کردن اطلاعات مشکلی ندارید اضافه کنید این بستگی به طرز معماری و استراتژی شما داره .
برای فرانت اند راه حلی ندارم چون react یاد ندارم ولی برای بک اند شما بیا یک مدیلور برای هر اعتبارسنجی و لاگین بود کاربر درست کن.
و اون میدلور روی api خودت قرار بده .
من برای لاگین بود کاربر از کد زیر استفاده میکنم
const passport = require('passport')
class redirectIfAuthenticated {
handel(req, res, next) {
passport.authenticate('jwt', {session: false}, (err, user, info) => {
if (err || !user) return res.status(401).json({
data: info.data || "شما اجازه دسترسی ندارید",
status: "error"
})
req.user = user;
return next()
})(req, res, next)
}
}
module.exports = new redirectIfAuthenticated();
من با استراتژی که نوشتم ('jwt'
داخل کد بالا ) مشخص میکنم کاربر لاگین هستش یا نه
این استراتژی jwt هستش
const passport = require('passport');
const passportJwt = require('passport-jwt');
const User = require('app/models/user');
const ExtractJWT = passportJwt.ExtractJwt;
const JwtStrategy = passportJwt.Strategy;
passport.use('jwt', new JwtStrategy({
jwtFromRequest: ExtractJWT.fromExtractors([
دستور پایین مشخص میکنه چطوری سرور بفهمه که کاربر لاگین هستش .
این دستور درخواستی از سمت کلاینت میاد چک میکنه و اگه داخل هدر درخواست، متغیری با نام کلمه ای که در رشته زیر قرار داره وجود داشته باشه و مقدار آن برابر با رشته جی دبلیو تی باشه اطلاعات کاربر بر میگردونه
ExtractJWT.fromHeader("authentication")
]),
// این کلید یک متغیری هستش که خودم قرار دادم که از فایل ای ان وی خوانده میشه سعی کنید کلیدتون یک رشته طولانی باشه
secretOrKey: config.secretKayJwt,
}, async (jwtPayload, done) => {
try {
const user = await User.findById(jwtPayload.id);
if (user) done(null, user)
else done(null, false, {data: "شما اجازه دسترسی ندارید"})
} catch (e) {
done(null, false, {data: e.message})
}
}))
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟