Skip to content

7. مثال [nuxt-04]: الحفاظ على جلسة عمل العميل/الخادم

يعالج مشروع [nuxt-04] مسألة الحفاظ على جلسة عمل العميل/الخادم. سنستخدم مشروع [nuxt-03] مع التعديلات التالية:

  • ستحتوي صفحة [index] على زر يزيد عداد مخزن [Vuex
  • تظل الصفحة [page1] دون تغيير؛
  • نريد أن يعرض الخادم الصفحة المطلوبة مع مخزن [Vuex] الذي تكون قيمة عداده هي آخر قيمة كانت موجودة على جانب العميل عند طلب الصفحة يدويًا من الخادم؛

يتم إنشاء مشروع [nuxt-04] مبدئيًا عن طريق استنساخ مشروع [nuxt-03]:

Image

تتغير صفحة [index] فقط:


<!-- page [index] -->
<template>
  <Layout :left="true" :right="true">
    <!-- navigation -->
    <Navigation slot="left" />
    <!-- message-->
    <template slot="right">
      <b-alert show variant="warning"> Home - value= {{ value }} </b-alert>
      <!-- bouton -->
      <b-button @click="incrementCounter" class="ml-3" variant="primary">Incrémenter</b-button>
    </template>
  </Layout>
</template>
 
<script>
/* eslint-disable no-undef */
/* eslint-disable no-console */
/* eslint-disable nuxt/no-env-in-hooks */
 
import Layout from '@/components/layout'
import Navigation from '@/components/navigation'
export default {
  name: 'Home',
  // components used
  components: {
    Layout,
    Navigation
  },
  data() {
    return {
      value: 0
    }
  },
  // life cycle
  beforeCreate() {
    // client and server
    console.log('[home beforeCreate]')
  },
  created() {
    // client and server
    this.value = this.$store.state.counter
    console.log('[home created], value=', this.value)
  },
  beforeMount() {
    // customer only
    console.log('[home beforeMount]')
  },
  mounted() {
    // customer only
    console.log('[home mounted]')
  },
  // event management
  methods: {
    incrementCounter() {
      console.log('incrementCounter')
      // counter increment of 1
      this.$store.commit('increment', 1)
      // change display value
      this.value = this.$store.state.counter
    }
  }
}
</script>
  • السطر 10: أضفنا زرًا لزيادة عداد مخزن [Vuex
  • السطر 54: الطريقة التي تتعامل مع [النقر] على زر [Increment
  • السطر 57: يتم زيادة عداد المخزن بمقدار 1؛
  • السطر 59: يتم تعيين قيمة العداد إلى الخاصية [value] بحيث يتم عرضها في السطر 8؛

قم بتشغيل مشروع [nuxt-04] باستخدام ملف [nuxt.config.js] التالي:


// source code directory
  srcDir: 'nuxt-04',
  // router
  router: {
    // application URL root
    base: '/nuxt-04/'
  },
  // server
  server: {
    // service port, default 3000
    port: 81,
    // network addresses listened to, default localhost: 127.0.0.1
    // 0.0.0.0 = all the machine's network addresses
    host: 'localhost'
}

عند التنفيذ، تظهر الصفحة الأولى كما يلي:

Image

بالنقر على الزر [3] عدة مرات، تظهر الصفحة الجديدة التالية:

Image

إذا استخدمت الرابط [3]، فستظهر لك الصفحة التالية:

Image

  • في [2]، تعرض الصفحة [page1] [1] قيمة العداد بشكل صحيح؛

الآن، دعونا نجدد الصفحة باستخدام [3]. الصفحة الجديدة هي كما يلي:

Image

  • في [2]، فقدنا قيمة العداد الحالية. لقد عدنا إلى قيمته الأولية؛

هذه النتيجة منطقية تمامًا إذا نظرت إلى السجلات:

  • في [1]، أعاد الخادم تنفيذ الدالة [nuxtServerInit]. ومع ذلك، فإن هذه الدالة هي كما يلي:
/* eslint-disable no-console */
export const state = () => ({
    // account
  counter: 0
})

export const mutations = {
   // increment counter by one [inc] value
  increment(state, inc) {
    state.counter += inc
  }
}

export const actions = {
  async nuxtServerInit(store, context) {
      // who executes this code?
    console.log('nuxtServerInit, client=', process.client, 'serveur=', process.server)
     // waiting for a promise to be fulfilled
    await new Promise(function(resolve, reject) {
       // this is normally an asynchronous function
       // we simulate it with a one-second wait
      setTimeout(() => {
          // success
        resolve()
      }, 1000)
    })
     // modify the blind
    store.commit('increment', 53)
      // log
    console.log('nuxtServerInit commit terminé')
  }
}

السطر 28 يضبط العداد على 53.

دعونا نفحص طلب HTTP الذي أرسله المتصفح عندما قمنا بتحديث صفحة [page1]:

Image

يمكننا أن نرى أنه بالإضافة إلى صفحة [page1] [1]، يطلب العميل عددًا من البرامج النصية من الخادم. لاحظ البرامج النصية [pages_index، pages_page1]، وهي البرامج النصية المرتبطة بصفحات [index، page]. يتم توفير هذه البرامج النصية مع كل طلب موجه إلى الخادم، بغض النظر عن الصفحة المطلوبة؛

في [1]، يتم طلب الصفحة [page1] من الخادم باستخدام طلب HTTP التالي:

GET http://localhost:81/nuxt-04/page1
Host: localhost:81
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache

يمكننا أن نرى أن هذا الطلب لا يرسل أي معلومات إلى الخادم. وبالتالي، لا يملك الخادم أي وسيلة لمعرفة حالة مخزن [Vuex] على جانب العميل. لكي يحدث ذلك، كان على العميل إرسال هذه المعلومات إلى الخادم.

في المشروع التالي [nuxt-05]، نستخدم ملف تعريف ارتباط حتى يتمكن العميل من إرسال المعلومات إلى الخادم عند الطلب.