मैं एक एपीआई रैपर लिखने के लिए नोड.जेएस फ्रेमवर्क और एक्सप्रेस मॉड्यूल का उपयोग कर रहा हूं जो किसी अन्य सर्वर पर अनुरोधों को पुनर्निर्देशित करता है। मैं लक्ष्य सर्वर पर अनुरोध को सफलतापूर्वक पुनर्निर्देशित कर सकता हूं और मुझे JSON पेलोड युक्त एक वैध प्रतिक्रिया प्राप्त होती है। हालांकि, प्रारंभिक अनुरोध के बाद, अगर मैं किसी अन्य अनुरोध का प्रयास करता हूं तो मुझे निम्न त्रुटि मिलती है।

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

यह उस कोड का एक नमूना है जिसे मैंने HTTP GET एक्सप्रेस मार्ग के लिए लिखा था:

app.get('/companyrecords/:name', function(req, res) {

  const options = {
    protocol: 'http:',
    hostname: 'myhost',
    port: 5001,
    method: 'GET',
    path: '/path/to/resource/?name=name',
    auth: 'username:password',
    headers: {
      Connection: 'close'
    }
  }

  const myAppReq = http.request(options, (myAppRes) =>{
    console.log(`STATUS: ${myAppRes.statusCode}`);
    myAppRes.on('data', (chunk) => {
      console.log(`BODY: ${chunk}`);
      res.send(chunk);
    });
        myAppRes.on('end', () => {
        res.end('No more data to send.');
    });
  });

  myAppReq.on('error', (err) => {
    console.error(`Problem with request: ${err.message}`);
  });

  myAppReq.write('');
  myAppReq.end();
});

सुनिश्चित नहीं है कि मुझे यह त्रुटि क्यों मिल रही है क्योंकि मैं req.write() विधि को कॉल कर रहा हूं ताकि अनुरोध के शीर्षलेख भेजे जा सकें। त्रुटि स्टैक ट्रेस को देखते समय ऐसा प्रतीत होता है कि त्रुटि तब होती है जब मैं 'डेटा' ईवेंट में कॉलबैक के अंदर res.send() विधि को कॉल करता हूं। शायद मैं अनुरोध के बीच निष्पादन के प्रवाह या उस क्रम को नहीं समझ रहा हूँ जिसमें घटनाएँ उत्सर्जित की जा रही हैं। किसी भी मार्गदर्शन/सूचना की बहुत सराहना की जाएगी।

0
Eddie 30 अक्टूबर 2018, 22:36

1 उत्तर

सबसे बढ़िया उत्तर

आपको data इवेंट कॉलबैक के अंदर प्रतिक्रिया नहीं भेजनी चाहिए क्योंकि प्रतिक्रिया तब भेजी जाएगी जब आपको डेटा का पहला हिस्सा प्राप्त होगा। आपको क्या करना चाहिए chunk को प्रतिक्रिया स्ट्रीम में लिखना और end ईवेंट कॉलबैक के अंदर प्रतिक्रिया भेजना:

const myAppReq = http.request(options, (myAppRes) =>{
    myAppRes.on('data', (chunk) => {
      res.write(chunk);
    });
    myAppRes.on('end', () => {
      res.end();
    });
});
1
Volodymyr 30 अक्टूबर 2018, 23:38