لا يمكن لـ Node.js تعيين الرؤوس بعد إرسالها.عند بدء طلب XHR ضمن طلب XHR آخر

StackOverflow https://stackoverflow.com/questions/9332698

سؤال

لا يستطيع Node.js التعامل مع كود العميل الذي ينفذ شيئًا مشابهًا لنمط jQuery/Zepto XHR أدناه:

$.ajax({
  type: 'POST',
  url: '/someUrl',
  success: function(response) {
     $.ajax({  // ... do another XHR

لقد قمت بهذا (بدء طلب XHR ضمن طلب XHR آخر) من قبل ضمن أطر عمل أخرى.لقد قرأت عن خطأ Node.js:لا يمكن تعيين الرؤوس بعد إرسالها وكيفية عمل النموذج القائم على الحدث لخادم Node.js.بمعنى آخر، لم يتم استدعاء طلب XHR الأول res.end() لذا عندما يتم استدعاء طلب XHR الثاني Node.js يشكو (في حلقة مستمرة راجع للشغل).

أسئلتي هي:هل سيكون بمقدور أي شخص أن يوصي بنمط بديل لتسلسل طلبات XHR من جانب العميل؟هل هناك شيء يمكنني القيام به من جانب خادم Node.js للحفاظ على النمط الحالي من جانب العميل؟

التحديث بناءً على الإجابة المقبولة
الخطأ بالتأكيد في الكود الجانبي للخادم الخاص بي.كانت دالة التحقق البسيطة ترمي خطأً ولكن عند اكتشافه، تم استدعاء res.end() فقط.لسببٍ ما، فإن الافتراض الذي كنت أقوم به عندما كنت أتصل بـ res.end() سيوقف تنفيذ الوظيفة على الفور.في هذه الحالة، يؤدي إدخال "إرجاع" إلى إيقاف التنفيذ فورًا بعد إرسال رسالة JSON إلى العميل.

if (_.isEmpty(req.body)) {  
  res.end(JSON.stringify({'Error':'POST required'}));
  // suppose 'return' is needed here as well
  return
} else {      
  try {
    if (_.has(req.body, 'id')) {
      id = parseInt(req.body['id']);
    } else {
      throw {'Error':'Missing param in req.body'};          
    } // end if
  } catch(err) {      
    res.end(JSON.stringify({'Error':'Missing key(s)','Keys':_.keys(req.body)}));
    // without a return here, the code below this 'do some more work' would 
    // be executed
    return
} // end else
// do some more work
// without the above 'return''s the code would
// a) make a database call
// b) call res.end() again!!! <-- bad. 
هل كانت مفيدة؟

المحلول

المشكلة ليست في ما تعتقده.يحدث جهازي XHR الخاصين بك بشكل تسلسلي، وليس بالتوازي، بسبب عمليات الاسترجاعات.ال success لن يتم إطلاق رد الاتصال الأول حتى تكتمل عملية الطلب/الاستجابة بأكملها للطلب الأول (استدعى Node.js بالفعل Response.end() واستقبل المتصفح الاستجابة وحللها).عندها فقط يبدأ XHR الثاني.نمط AJAX من جانب العميل الذي لديك جيد.سيعمل مع Node.js وأي خادم ويب آخر بشكل جيد.

مشكلتك تكمن في كود Node.js من جانب الخادم الخاص بك، ولكنها ليست خطأ أو قيودًا في العقدة، إنها خطأ برمجي من جانبك.انشر الرمز الجانبي للخادم الخاص بك ويمكننا مساعدتك في تعقبه.من الشائع جدًا أن يواجه مبتدئو Node.js هذا الخطأ من خلال خطأ بسيط في الترميز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top