اذهب إلى المحتوى

السؤال

نشر

هذا الخطأ بحثت عنه واكتشفت انه بسبب ان الاستجابة غير معدلة 

Not Modified response code
كيف أجعل هذا الاى بى أى معدل لكى اتجنب هذا الخطأ 

// model


const mongoose = require("mongoose");

const questSchema = mongoose.Schema({
  name: String,
  answers: [
    {
      ansName: String,
      correct: Boolean,
    },
  ],
});

module.exports.Quest = mongoose.model("Quest", questSchema);

 

// router


const express = require("express");
const router = express.Router();
const { Quest } = require("../model/question");

router.get("/", async (req, res) => {
  const questions = await Quest.find();
  if (!questions) res.send("Not Found");
  res.send(questions);
});

router.post("/", async (req, res) => {
  let newQuest = new Quest({
    name: req.body.name,
    answers: req.body.answers,
  });
  newQuest = await newQuest.save();

  res.send(newQuest);
});

module.exports = router;

 

// index.js


const questRouter = require("./router/questions");

app.use(express.json());
app.use(morgan("tiny"));
app.use("/questions", questRouter);

 

ان لم يكن الخطأ هنا فى الباك اند فهل من الممكن ان يكون فى الفرونت اند .. 
انا استخدمت اكسيوس 

  const getQuestions = () => {
    axios
      .get('http://10.0.2.2:3000/questions')
      .then(res => setQuestions(res.data))
      .then(console.log(questions))
      .catch(err => console.log(err));
  };

  useEffect(() => {
    getQuestions();
  }, []);

ومرة الداتا تطبع ويتم جلبها ومرة لا 

Recommended Posts

  • 0
نشر
بتاريخ 7 دقائق مضت قال Ahmed Sawy:

جربت الطريقتين ولم تنفع للأسف .. 
الاولى فعلت هكذا 


router.get("/*", async (req, res, next) => {
  const questions = await Quest.find();
  if (!questions) res.send("Not Found");
  res.send(questions);
  res.setHeader("Last-Modified", new Date().toUTCString());
  next();
});

وجلب لى هذا الخطأ

 

الثانية نفعت وتم تغيير الكود من 304 الى 200 ولكن لم تحل المشكلة فى الفرونت اند .. هل لك ان تلقى نظرة على الفرونت اند ربما يتكون المشكلة هناك 

تنفيذك للطريقة الأولى خاطئه فكان لابد أن يكون الكود النهائي بالشكل التالي في ملف index.js

// index.js


const questRouter = require("./router/questions");

app.use(express.json());
app.use(morgan("tiny"));
app.get('/*', function(req, res, next){ 
  res.setHeader('Last-Modified', (new Date()).toUTCString());
  next(); 
});
app.use("/questions", questRouter);

بالنسبة للفرونت إند فلديك خطأ بسيط هنا 

<Text>{questions[index].name}</Text>

حيث أنك تقوم بعرض الإسم الخاص بالسؤال صاحب index صفر 
ولكن في أول مرة يعرض فيها المكون يكون 
index = 0

questions = []
وبالتالي لايوجد شئ في الاندكس صفر ويكون الناتج undefined ويظهر لك الخطأ

  • 1
نشر

يمكنك تعديل الكود الخاص ب return كالتالي 

  return (
    <View>
    {questions.length > 0 &&  <Text>{questions[index].name}</Text>
      {num === index ? (
        <Text>{questions[index].answers[0].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[1].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[2].ansName}</Text>
      ) : null} 

      {Done ? <Text>Test is Done</Text> : null}


      {CorrectMessage === true ? (
        <Text style={{color: 'red'}}>Wrong Answer</Text>
      ) : null}

      <Button
        color={IsSelected === 1 ? 'green' : 'blue'}
        title="A"
        onPress={() => {
          setIsSelected(1);
          handleSelect(0);
        }}
      />
      <Button
        color={IsSelected === 2 ? 'green' : 'blue'}
        title="B"
        onPress={() => {
          setIsSelected(2);
          handleSelect(1);
        }}
      />
      <Button
        color={IsSelected === 3 ? 'green' : 'blue'}
        title="C"
        onPress={() => {
          setIsSelected(3);
          handleSelect(2);
        }}
      />

      <Button title=">>" onPress={handelSubmit} /> }
    </View>
  );

 

  • 0
نشر

هذا ليس خطأ وإنما رقم حالة الاستجابة Status Code ولكل رقم معنى معين

فالرقم 304 يشير الى Not Modified يعني ليس هناك جديد في الإستجابة لأنها لازلت كما هي سابقا

لذلك إذا أردت أن لا يظهر لك هذا الرقم فيجب أن تكون الإستجابة جديدة وليست مثل سابقتها أما إذا أردت عمل ما يسمى بال Hard Reload في المتصفح فيمكنك الضغط على

ctrl + shift + R

في كود ال Frontend

  const getQuestions = () => {
    axios
      .get('http://10.0.2.2:3000/questions')
      .then(res => setQuestions(res.data))
      .then(console.log(questions))
      .catch(err => console.log(err));
  };

  useEffect(() => {
    getQuestions();
  }, []);

انت تقوم بعمل طلب للحصول على الأسئلة فإذا قمت بعمل طلب لأول مرة فستحصل على الأجوبة وعلى رقم الحالة 200 يعني تم بنجاح

وإذا أردت عمل طلب مرة أخرى ولكن الأسئلة لم تتغير أبداً فستحصل على رقم الحالة 304 ويعني أن الإستجابة لم تتغير مازالت مثل سابقتها

  • 0
نشر
بتاريخ 3 دقائق مضت قال عبدالمجيد الجرادي:

هذا ليس خطأ وإنما رقم حالة الاستجابة Status Code ولكل رقم معنى معين

فالرقم 304 يشير الى Not Modified يعني ليس هناك جديد في الإستجابة لأنها لازلت كما هي سابقا

لذلك إذا أردت أن لا يظهر لك هذا الرقم فيجب أن تكون الإستجابة جديدة وليست مثل سابقتها أما إذا أردت عمل ما يسمى بال Hard Reload في المتصفح فيمكنك الضغط على

ctrl + shift + R

لكنى للأسف هذا لاى بى اى يعمل للمرة الاولى فقط وبعد ذلك يظهر لى هذا الايرور عندما اعمل run للتطبيق على الهاتف ..
undefined is not an object (evaluating 'questions[index].name')

هذا الخطأ فوق يظهر بسبب ان الداتا تظهر وتختفى .. حيث اننى اطبعها فى الكونسول ومرة تظهر الداتا ومرة اخرى تكون [ ] عبارة عن مصفوفة فارعة


لذلك انا اريد علاجه 

  • 0
نشر

 

بتاريخ 5 دقائق مضت قال Ahmed Sawy:

لكنى للأسف هذا لاى بى اى يعمل للمرة الاولى فقط وبعد ذلك يظهر لى هذا الايرور عندما اعمل run للتطبيق على الهاتف ..
undefined is not an object (evaluating 'questions[index].name')

هذا الخطأ فوق يظهر بسبب ان الداتا تظهر وتختفى .. حيث اننى اطبعها فى الكونسول ومرة تظهر الداتا ومرة اخرى تكون [ ] عبارة عن مصفوفة فارعة


لذلك انا اريد علاجه 

يجب عليك مراجعة الكود لأن المشكلة أنك تقوم بإستدعاء name من questions[index] وهي undefined يعني غير موجودة 

  • 0
نشر
بتاريخ الآن قال عبدالمجيد الجرادي:

يجب عليك مراجعة الكود لأن المشكلة أنك تقوم بإستدعاء name من questions[index] وهي undefined يعني غير موجودة 

انا اعلم .. undefined يعني غير موجودة  وهذا بسبب ان get request احيانا يظهر الداتا ويعمل التطبيق بشكل صحيح .. واحيانا الداتا لا تظهر فيعطينى undefined يعني غير موجودة. 


 

import axios from 'axios';
import React, {useEffect, useState} from 'react';
import {Text, View, Button} from 'react-native';


export default function Pagination() {
  const [num, setNum] = useState(0);
  const [questions, setQuestions] = useState([]);
  const [index, setIndex] = useState(0);
  const [Correct, setCorrect] = useState(false);
  const [Done, setDone] = useState(false);
  const [CorrectMessage, setInCorrectMessage] = useState(false);
  const [Answer, setAnswer] = useState(1);
  const [IsSelected, setIsSelected] = useState(0);

  const getQuestions = () => {
    axios
      .get('http://10.0.2.2:3000/questions')
      .then(res => setQuestions(res.data))
      .then(console.log(questions))
      .catch(err => console.log(err));
  };

  useEffect(() => {
    getQuestions();
  }, []);

  const handleSelect = answerParam => {
    setCorrect(true);
    setAnswer(answerParam);
    setInCorrectMessage(false);
  };

  const handelSubmit = () => {
    if (questions[index].answers[Answer].correct === Correct) {
      setNum(num + 1);
      setIndex(index + 1);
      setIsSelected(0);
    } else if ((index = questions.length - 1)) {
      setDone(true);
    } else {
      setInCorrectMessage(true);
      console.log('Not Correct');
    }
  };

  return (
    <View>
       <Text>{questions[index].name}</Text>
      {num === index ? (
        <Text>{questions[index].answers[0].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[1].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[2].ansName}</Text>
      ) : null} 

      {Done ? <Text>Test is Done</Text> : null}


      {CorrectMessage === true ? (
        <Text style={{color: 'red'}}>Wrong Answer</Text>
      ) : null}

      <Button
        color={IsSelected === 1 ? 'green' : 'blue'}
        title="A"
        onPress={() => {
          setIsSelected(1);
          handleSelect(0);
        }}
      />
      <Button
        color={IsSelected === 2 ? 'green' : 'blue'}
        title="B"
        onPress={() => {
          setIsSelected(2);
          handleSelect(1);
        }}
      />
      <Button
        color={IsSelected === 3 ? 'green' : 'blue'}
        title="C"
        onPress={() => {
          setIsSelected(3);
          handleSelect(2);
        }}
      />

      <Button title=">>" onPress={handelSubmit} />
    </View>
  );
}

 

  • 0
نشر
بتاريخ 7 دقائق مضت قال Abdullah Muhammad:

هذه المشكله خاصة بالكاش ولحلها يمكنك إستخدام إحدى الطريقتين التاليتين 
 


app.get('/*', function(req, res, next){ 
  res.setHeader('Last-Modified', (new Date()).toUTCString());
  next(); 
});

او 


app.disable('etag');

وذلك قبل إستخدامك ل 
 


app.use("/questions", questRouter);

 

جربت الطريقتين ولم تنفع للأسف .. 
الاولى فعلت هكذا 

router.get("/*", async (req, res, next) => {
  const questions = await Quest.find();
  if (!questions) res.send("Not Found");
  res.send(questions);
  res.setHeader("Last-Modified", new Date().toUTCString());
  next();
});

وجلب لى هذا الخطأ

 

الثانية نفعت وتم تغيير الكود من 304 الى 200 ولكن لم تحل المشكلة فى الفرونت اند .. هل لك ان تلقى نظرة على الفرونت اند ربما يتكون المشكلة هناك 

  • 0
نشر
بتاريخ 1 دقيقة مضت قال Abdullah Muhammad:

تنفيذك للطريقة الأولى خاطئه فكان لابد أن يكون الكود النهائي بالشكل التالي في ملف index.js


// index.js


const questRouter = require("./router/questions");

app.use(express.json());
app.use(morgan("tiny"));
app.get('/*', function(req, res, next){ 
  res.setHeader('Last-Modified', (new Date()).toUTCString());
  next(); 
});
app.use("/questions", questRouter);

بالنسبة للفرونت إند فلديك خطأ بسيط هنا 


<Text>{questions[index].name}</Text>

حيث أنك تقوم بعرض الإسم الخاص بالسؤال صاحب index صفر 
ولكن في أول مرة يعرض فيها المكون يكون 
index = 0

questions = []
وبالتالي لايوجد شئ في الاندكس صفر ويكون الناتج undefined ويظهر لك الخطأ

وما فى رايك علاج هذه المشكلة ؟؟

بتاريخ 1 دقيقة مضت قال Abdullah Muhammad:

تنفيذك للطريقة الأولى خاطئه فكان لابد أن يكون الكود النهائي بالشكل التالي في ملف index.js


// index.js


const questRouter = require("./router/questions");

app.use(express.json());
app.use(morgan("tiny"));
app.get('/*', function(req, res, next){ 
  res.setHeader('Last-Modified', (new Date()).toUTCString());
  next(); 
});
app.use("/questions", questRouter);

بالنسبة للفرونت إند فلديك خطأ بسيط هنا 


<Text>{questions[index].name}</Text>

حيث أنك تقوم بعرض الإسم الخاص بالسؤال صاحب index صفر 
ولكن في أول مرة يعرض فيها المكون يكون 
index = 0

questions = []
وبالتالي لايوجد شئ في الاندكس صفر ويكون الناتج undefined ويظهر لك الخطأ

وما هو حل هذه المشكلة الخاصة بالفرونت اند ؟؟

  • 0
نشر
بتاريخ 9 دقائق مضت قال Abdullah Muhammad:

يمكنك تعديل الكود الخاص ب return كالتالي 


  return (
    <View>
    {questions.length > 1 &&  <Text>{questions[index].name}</Text>
      {num === index ? (
        <Text>{questions[index].answers[0].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[1].ansName}</Text>
      ) : null}
      {num === index ? (
        <Text>{questions[index].answers[2].ansName}</Text>
      ) : null} 

      {Done ? <Text>Test is Done</Text> : null}


      {CorrectMessage === true ? (
        <Text style={{color: 'red'}}>Wrong Answer</Text>
      ) : null}

      <Button
        color={IsSelected === 1 ? 'green' : 'blue'}
        title="A"
        onPress={() => {
          setIsSelected(1);
          handleSelect(0);
        }}
      />
      <Button
        color={IsSelected === 2 ? 'green' : 'blue'}
        title="B"
        onPress={() => {
          setIsSelected(2);
          handleSelect(1);
        }}
      />
      <Button
        color={IsSelected === 3 ? 'green' : 'blue'}
        title="C"
        onPress={() => {
          setIsSelected(3);
          handleSelect(2);
        }}
      />

      <Button title=">>" onPress={handelSubmit} /> }
    </View>
  );

 

نفعت اخى شكرا لك .. فيها سينتاك ايرور لكنى عالجته ونفقت الحمد لله .. شكرا 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...