میلاد
2 سال پیش توسط میلاد مطرح شد
10 پاسخ

اجرا شدن خط به خط کد های جاوااسکریپت

سلام،
دوستان من یه کد دارم میخوام خط به خط لود بشه به طوری که قبل از اینکه خط اول لود نشده نره سراغ خط دوم و غیره

try{
    await Authentication();
    setLangName(user.language)
    const getData = await getDataLang({ langName });
    setLangText(getData);
    setLoading(false);
    }
    catch(e){
    toast.error('خطایی رخ داده است لطفاً بعدا تلاش کنید')
    setLoading(false);

    }

اما هر بار که تست میگیرم سریع پشت سر هم کد ها اجرا میشه
ممنون میشم راهکاری بهم یاد بدید


ثبت پرسش جدید
متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

تا جایی که من میدونم جاوا اسکریپت کد ها از بالا به پایین اجرا میکنه .
شما وقتی از دستور await استفاده کنی جاوا اسکریپت اونو پردازش میکنه ولی منتظر جوابش نمیمونه ، وقتی جوابش اومد ، جواب ارسال میکنه . یکی از دلیل هایی که میگن node js خیلی سریع همین async و await هستش.

میشه سناریویی که تو ذهنت داری توضیح بدی. برای چرا میخوای جاوا اسکریپت برای کدی که هنوز جوابش نیومده الاف کنی 😄؟


میلاد
تخصص : MERN Stack developer
@miladam 2 سال پیش مطرح شد
0

😂😂
یه پنل مشتری نوشتم و قبل از لود صفحه یه لایه ایجاد کرده به وسیله اون لایه، ابتدا، لاگین بودن یوزر رو بررسی کنه، بعد اجازه ورود بده
یوزری که لاگین هست اطلاعاتش اعم نام و..... و زبانی که موقع ثبت نام انتخاب کرده رو به وسیله ای پی آی برمیگردونم تو کد هام و با توجه به این اطلاعات بقیه صفحه مثل زبان نوشتاری سایت و امکاناتی که اون یوزر میتونه بهش دسترسی داشته باشه رو رندر میکنه
حالا چون هنوز اعتبار سنجی تموم نشده میره خط بعدی و چون زبانش مشخص نیست کد ها خطا میگیرن

روش بهتری به ذهنم نرسید اگه روش بهتری بهم معرفی کنی که فوق العاده میشه، اونوقت هم روش جدید یاد گرفتم هم از این چالش خلاص شدم 😀


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

خب چرا هر کدوم از اعتبارسنجی ها رو در قالب یک 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)

میلاد
تخصص : MERN Stack developer
@miladam 2 سال پیش مطرح شد
0

ممنونم مشکل من اینجاست که دارم از nodeJs به عنوان بک اند استفاده میکنم و از ریکت به عنوان فرانت
برای اعتبار سنجی، توکن ذخیره شده تو لوکال استوریج رو میفرستم سرور و پاسخش که حاوی اطلاعات یوزر هست رو دریافت میکنم


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

ازjwt-token استفاده میکنی ؟


میلاد
تخصص : MERN Stack developer
@miladam 2 سال پیش مطرح شد
0

بله، دقیقا


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

شما اطلاعات کاربر میتونی به صورت hash داخل رشته jwt قرار بدی و سمت فرانت اند با پکیج jwt-decode این رشته decode کنی و توی localstorage ذخیره کنی تا دیگه درخواست به سمت سرور ارسال نکنی تا اطلاعات کاربر بگیری


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

حقیقتش من با react کار نکردم
ولی اینکارو با vue انجام دادم و با vuex مشخص میکنم که رشته jwt اعتبار لازم داره یا نه
برای react هم باید همچین پکیجی باشه که state ها mutations تعریف کرد


میلاد
تخصص : MERN Stack developer
@miladam 2 سال پیش مطرح شد
0

واقعاً معرفی این پکیج عالی بود
من سعی فقط نام و ایمیل فرد رو تو توکن ذخیره کنم و برای مابقی اطلاعات مجبوره به دیتابیس وصل شم
برای این موضوع، راه حلی دارید بتونم انجام بدم یا پیشنهاد میدید اطلاعات ذخیره شده تو توکن رو افزایش بدم؟


متین طیبی نیا
تخصص : nodejs
@MatinTayebi 2 سال پیش مطرح شد
0

اگه با اضافه کردن اطلاعات مشکلی ندارید اضافه کنید این بستگی به طرز معماری و استراتژی شما داره .
برای فرانت اند راه حلی ندارم چون 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})
    }
}))

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام