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

مشكله في express build files

Kirolos Nagy2

السؤال

عامل موقع لاختصار الروابط بساتخدام React js - Node js

الموقع شغال في وضع المطور لاكن عند عمل build لملفات React js 

ووضعها في مجلد public في ال server 

عند طلب الصفحه الرئيسيه لا يوجد مشكله -> http://localhost:5000/

لاكن عند التنقل للصفحه الاخري -> http://localhost:5000/S6548T

يرجع صفحه مكتوب فيها JSON فقط ولا يرجع الصفحه بهذا الشكل Screenshot2023-04-17132350.thumb.png.cf094e008b0dde22520dfab442544d22.png

وهذه الاكواد المستخدمه في الخادم ملف app.js

code.thumb.png.8ca48e53514cf651b650ab0a8d05ba94.png

وملف links.js بداخل مجلد route

1.thumb.png.fb2d1bebc48f756b583791e5cb5b06a9.png

وال controller 

2.thumb.png.15ee5d9f9536c774563e10b1c34f2b82.png

 

وهذا الملف في React js

3.thumb.png.5abb736463c57c91840d6efa5bcb0ff9.pngf

عايز افهم فين المشكله ان هو مش بيظهرلي الصفحه نفسها وبيظهر ال JSON Request

مع العالم البسيط انا محتاج الرابط الثاني يكون بهذا الشكل 
https://localhost:5000/Z5454T

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0
بتاريخ 2 ساعة قال Kerollos Nagy:

نفس المشكله 

هي زي ما بقولك هي شغاله كويس الطرقتين بس لما بعمل build واحطو في ملفات الخادم ساعتها بيحصل المشكله 

شوف كده الملفات

Links.rar 69.95 MB · 0 تنزيلات

يحدث هذا لأنك أصلا تعيد كائن JSON من موجه Node في Show_Link تابع المتحكم linksController:

exports.Show_Link = (req,res,next)=>{
    const data = {
        short:req.params.id
    }
    Links.findOne(data).then(link =>{
        if(!link){
            res.status(404).send("ERROR")
        }
        else{
            
            res.send({link:link.link});
            ^^^^^^^^^^^^^^^^^^^^^^^^^
        }
    }).catch(err =>{
        res.status(400).send(err)
        console.log(err)
    })
}

وهو الخرج الطبيعي ومن العادي ان يظهر رد كـ:

screencapture-localhost-5000-S139085T-2023-04-17-17_45_26.thumb.png.28e53ad6d78bd3d52f6f8f303073c8b0.png

فالخادم هو الأولى بعملية التوجيه، وان كان كل من الخادم والعميل يعيدان خرجا ما عن المسار id:/ فإنه سيتم اعتبار ذلك الخاص بالخادم بطبيعة الحال، لأن العميل لا يزال يحتاج حقن ملف التوجيه في المتصفح لتولي عملية التوجيه، ولحد قيامه ذلك سيحتاج من الخادم تصيير المكون الذي يتولى ذلك، فإن كان الخادم يعيد JSON فلا العميل ولا الخادم يتوصلان للصفحة الفرعية التي يصيرها العميل. وهو ما يحدث معك ببساطة. وذات المشكلة تحدث في كثير من المرات في تطبيقات SPA من مختلف التقنيات.

لحل مثل هاته المشكلة،ينصح بفصل عمليتي التوجيه، ومن الأحسن تسبيق مسارات الخادم بسابقة ولتكن api/ فيكون في ملف app.js تطبيق express كـ:

app.use('/api', linksRouter);

ثم لنصلح المسارات المعنية في جزء العميل ولنعتبر اضافة هاته السابقة، اي في تطبيق React. 

في ملف Home.jsx:

if(Link !=='' && Link.length > 3){
            axios.post("/api/create" , data).then(links =>{

في ملف shortCut.jsx: 

axios.get(`/api/` + data.short)
        .then(links =>{

أعد البناء عن طريق تنفيذ npm run build وانقل مجلد build الى مجلد public في تطبيق express مرة أخرى.

وكخطوة أخيرة تماما، سنحتاج اخبار موجه express ان يقوم بتوجيه اي طلب يختلف عن طلبيات ال api الى ملف index.html داخل مجلد public/build وذلك حتى يمكن لتطبيق react ان يحمل موجهه على المتصفح ويتولى عملية التوجيه بدلا عن express. ولفعل ذلك اضف السطر التالي في ملف app.js في تطبيق الخادم: 

app.use('/api', linksRouter);
app.use(express.static(path.join(__dirname, '/public/build')));
app.get('*', (req, res) => {
    res.sendFile(path.join(__dirname + '/public/build/index.html'));
});

انتبه الى ترتيب تصريح الموجهات في هذا الملف، أعد تشغيل الامر npm run start على تطبيق الخادم وسيشتغل معك بشكل طبيعي.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

المشكلة تكمن في الـ endpoint الذي تقوم بزيارته عند التنقل إلى الصفحة الثانية، حيث يتم إرجاع JSON بدلاً من الصفحة المرتقبة كما ذكرت.

وعلى الأرجح أن المشكلة بسبب الكود الموجود في ملف controller.js حيث يتم البحث عن رابط الاختصار بالاستعانة بالـ ID الموجود في رابط الطلب، ولكن الرابط المسترجع لا يملك تنسيق HTML بل هو JSON فقط، مما يشير إلى أن البحث لم يكن ناجحًا في استرجاع الرابط الصحيح.

لذا، يمكنك التحقق من صحة الـ endpoint المستخدم في الـ request الخاص بـ "Show_Link" للتأكد من استرجاع الرابط الصحيح، وأيضًأ التحقق من صحة الرابط المستخدم في المتغير "data" في ملف React js حيث يتم إرسال طلب GET لاسترجاع الرابط المختصر.

وأرجو منك بعد ذلك، كتابة الأكواد بشكل نصي من خلال إضافتها عبر أيقونة <> عند إضافة السؤال.

وإذا استمرت المشكلة، قم بإرفاق مجلد المشروع بعد ضغطه.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 8 دقائق مضت قال Mustafa Suleiman:

المشكلة تكمن في الـ endpoint الذي تقوم بزيارته عند التنقل إلى الصفحة الثانية، حيث يتم إرجاع JSON بدلاً من الصفحة المرتقبة كما ذكرت.

وعلى الأرجح أن المشكلة بسبب الكود الموجود في ملف controller.js حيث يتم البحث عن رابط الاختصار بالاستعانة بالـ ID الموجود في رابط الطلب، ولكن الرابط المسترجع لا يملك تنسيق HTML بل هو JSON فقط، مما يشير إلى أن البحث لم يكن ناجحًا في استرجاع الرابط الصحيح.

لذا، يمكنك التحقق من صحة الـ endpoint المستخدم في الـ request الخاص بـ "Show_Link" للتأكد من استرجاع الرابط الصحيح، وأيضًأ التحقق من صحة الرابط المستخدم في المتغير "data" في ملف React js حيث يتم إرسال طلب GET لاسترجاع الرابط المختصر.

وأرجو منك بعد ذلك، كتابة الأكواد بشكل نصي من خلال إضافتها عبر أيقونة <> عند إضافة السؤال.

وإذا استمرت المشكلة، قم بإرفاق مجلد المشروع بعد ضغطه.

لما بستخدم postman بيرجه البيانات صح ولو الرابط مش موجود بيرجع كلمه ERROR

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

ربما الخطأ في الكود الذي تستخدمه في React JS، في طريقة استدعاء البيانات من API أو في معالجة البيانات المسترجعة،  ويمكنك مراجعة الكود الخاص بك والتأكد من أنه يتفق مع تنسيق البيانات المسترجعة من API، ومراجعة مخرجات console.log() في متصفحك في حال وجود أي رسائل خطأ.

حاول تجربة الكود التالي بالنسبة لكود react

import { useEffect, useState } from 'react'; 
import axios from 'axios'; 

function ShortCut({match}) { 
  const [error, setError] = useState(""); 
  const [short, setShort] = useState(""); 

  const getShortLink = () => { 
    const data = { 
      short: match.params.id 
    }; 

    axios.get(`/${data.short}`) 
      .then(response => { 
        console.log(response.data.link);
        if (response.data.link.startsWith("https://") || response.data.link.startsWith("http://")) { 
          setShort(response.data.link); 

        } else { 
          setShort("https://" + response.data.link); 
        } 
      }) 
      .catch(error => { 
        setError("Not Found This Url"); 
      }); 
  }; 

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

  return ( 
    <div className='shortcut'> 
      {!error ? <p>OPENING</p> : ""} 
      {error ? 
        <div> 
          <h2>Not Found URL</h2> 
          <a href="/">Go To Home</a> 
        </div> 
        :  ''} 
      <h1>SHORTCUT</h1> 
      <p>{short}</p> 
      <button onClick={getShortLink}>GET LINKS</button> 
    </div> 
  ); 
}

export default ShortCut;

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Mustafa Suleiman:

ربما الخطأ في الكود الذي تستخدمه في React JS، في طريقة استدعاء البيانات من API أو في معالجة البيانات المسترجعة،  ويمكنك مراجعة الكود الخاص بك والتأكد من أنه يتفق مع تنسيق البيانات المسترجعة من API، ومراجعة مخرجات console.log() في متصفحك في حال وجود أي رسائل خطأ.

حاول تجربة الكود التالي بالنسبة لكود react

import { useEffect, useState } from 'react'; 
import axios from 'axios'; 

function ShortCut({match}) { 
  const [error, setError] = useState(""); 
  const [short, setShort] = useState(""); 

  const getShortLink = () => { 
    const data = { 
      short: match.params.id 
    }; 

    axios.get(`/${data.short}`) 
      .then(response => { 
        console.log(response.data.link);
        if (response.data.link.startsWith("https://") || response.data.link.startsWith("http://")) { 
          setShort(response.data.link); 

        } else { 
          setShort("https://" + response.data.link); 
        } 
      }) 
      .catch(error => { 
        setError("Not Found This Url"); 
      }); 
  }; 

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

  return ( 
    <div className='shortcut'> 
      {!error ? <p>OPENING</p> : ""} 
      {error ? 
        <div> 
          <h2>Not Found URL</h2> 
          <a href="/">Go To Home</a> 
        </div> 
        :  ''} 
      <h1>SHORTCUT</h1> 
      <p>{short}</p> 
      <button onClick={getShortLink}>GET LINKS</button> 
    </div> 
  ); 
}

export default ShortCut;

 

نفس المشكله 

هي زي ما بقولك هي شغاله كويس الطرقتين بس لما بعمل build واحطو في ملفات الخادم ساعتها بيحصل المشكله 

شوف كده الملفات

Links.rar

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...