2012-10-31 20 views
9

जानने के लिए node.js सीखने के लिए मैं एक छोटा ऐप बना रहा हूं जो कुछ आरएसएस फ़ीड को mongoDB में संग्रहीत करता है, उन्हें संसाधित करता है और इन्हें एक एकल फ़ीड (दिनांक द्वारा क्रमबद्ध) बनाता है।एक्सप्रेस अनुरोध को दो बार

यह ~ 1000 ब्लॉग आइटमों के साथ ~ 50 आरएसएस फ़ीड की एक सूची को पार करता है, इसलिए पूरे पार्स को काफी लंबा करना है, इसलिए मैंने निम्नलिखित फीड लाने और पार्स करने के लिए काफी समय निकालने के लिए निम्नलिखित req.connection.setTimeout(60*1000); डाला।

सबकुछ ठीक से चलता है, लेकिन अनुरोध को दो बार बुलाया जाता है। (मैंने वायरशर्क के साथ जांच की, मुझे नहीं लगता कि यह यहां फेविकॉन के बारे में है)।

मुझे वास्तव में यह नहीं मिलता है।

आप यहां अपने आप का परीक्षण कर सकते हैं: http://mighty-springs-9162.herokuapp.com/feed/mde/20 (इसे "एमडीई" के बारे में पिछले 20 लेखों के साथ एक आरएसएस फ़ीड बनाना चाहिए)।

कोड यहाँ है: https://github.com/xseignard/rss-unify

और यदि हम दिलचस्प बिट्स पर ध्यान केंद्रित: मैं एक मार्ग इस तरह परिभाषित किया है

:

: app.get('/feed/:name/:size?', topics.getFeed);

और topics.getFeed इस तरह है

function getFeed(req, res) { 
    // 1 minute timeout to get enough time for the request to be processed 
    req.connection.setTimeout(60*1000); 

    var name = req.params.name; 
    var callback = function(err, topic) { 
    // if the topic has been found 
    if (topic) { 
    // aggregate the corresponding feeds 
    rssAggregator.aggregate(topic, function(err, rssFeed) { 
     if (err) { 
     res.status(500).send({error: 'Error while creating feed'}); 
     } 
     else { 
     res.send(rssFeed); 
     } 
    }, 
    req); 
    } 
    else { 
    res.status(404).send({error: 'Topic not found'}); 
    }}; 
    // look for the topic in the db 
    findTopicByName(name, callback); 
} 

तो कुछ भी कल्पना नहीं है, लेकिन फिर भी, यह मिलता है फीड फ़ंक्शन को दो बार बुलाया जाता है।

क्या गलत है? कोई उपाय?

+0

सबसे आम समस्या है कि कहीं न कहीं आप उपयोग करना भूल गया 'return' –

+0

हैलो mvbl-FST, मैं नहीं आप भूल' '' return''' से क्या मतलब है मिलता है। क्या आप और अधिक व्याख्या कर सकते हैं? –

+0

मैं उपर्युक्त के बारे में गलत हो सकता हूं और इस कोड में इसे दो बार निष्पादित करने के लिए कुछ भी नहीं खड़ा है (favicon.ico को छोड़कर, लेकिन आपने कहा कि यह प्रश्न से बाहर है)। एकमात्र चीज जो मैं करूँगा वह है 'वापसी करें टोपीबिननाम (नाम, कॉलबैक); '। लेकिन यकीन है कि यह मदद नहीं करेगा। –

उत्तर

9

इससे मुझे लंबे समय तक परेशान किया गया। यह संभवतः फायरबग एक्सटेंशन है जो पृष्ठभूमि में प्रत्येक जीईटी अनुरोध का डुप्लिकेट भेज रहा है। यह सुनिश्चित करने के लिए कि समस्या नहीं है, फ़ायरबग को बंद करने का प्रयास करें।

+0

यह मेरे मामले में भी मुद्दा था। Http: // localhost से अनुरोध प्राप्त करें: 3000/ट्रैक को एक बार बुलाया गया था, http: // localhost: 3000/ट्रैक/पोस्ट को दो बार कॉल किया गया था। जब मैंने फ़ायरबग (क्रोम में) बंद कर दिया, तो दूसरा अनुरोध एक बार भी बुलाया गया। –

+0

यह मेरे साथ भी हुआ, लेकिन क्रोम देव उपकरण के साथ। मैं अपने बालों को बाहर निकालने की कोशिश कर रहा था। – Jeffpowrs

+0

मेरे पास एक ही समस्या है और यह निश्चित रूप से फ़ायरबग नहीं है। यह किसी भी तरह से मेरे मामले में एक प्रतिक्रिया समय से संबंधित है, क्योंकि मेरा अनुरोध जिसे दो बार कहा जाता है, बहुत कंप्यूटिंग करता है और 3-4 मिनट के बाद प्रतिक्रिया भेजता है। और दूसरा अनुरोध तब नहीं हो रहा है जब मैं किसी भी कम्प्यूटिंग के साथ तेजी से प्रतिक्रिया देता हूं। – user619271

1

आपको टाइमआउट को और भी बढ़ाना पड़ सकता है। मैंने एक्सप्रेस स्रोत नहीं देखा है लेकिन यह सिर्फ टाइमआउट पर लगता है, यह पुनः प्रयास करता है।

2

यदि आपके पास अपनी साइट पर फेविकॉन है, तो इसे हटाएं और पुनः प्रयास करें। अगर आपकी समस्या हल हो जाती है, तो अपने फेविकॉन यूआरएल

0

को दोबारा प्रतिक्रिया दें। तब मैंने वापसी जोड़ने की कोशिश की, यह काम नहीं किया। लेकिन जब मैं रिटर्न res.redirect ('/ path') जोड़ता हूं तो यह काम करता है;

2

मैं अब भी उतनी ही कम कर रहा हूं, और वही बात देखी।

मैं इस तरह क्रोम में एपीआई पता दर्ज करके अपने सर्वर का परीक्षण कर रहा हूँ:

http://127.0.0.1:1337/links/1

मेरी Node.js सर्वर तो आईडी के आधार पर एक json वस्तु के साथ दे रहा है।

मैंने प्राप्त विधि में एक कंसोल लॉग सेट किया और देखा कि जब मैं क्रोम के एड्रेस बार में आईडी बदलता हूं तो यह अनुरोध भेजता है (वास्तव में अनुरोध भेजने के लिए प्रवेश करने से पहले) और सर्वर मेरे बाद एक और अनुरोध स्वीकार करता है वास्तव में प्रवेश मारा। यह क्रोम देव कंसोल के साथ और बिना होता है।

आईई 11 एक ही तरीके से काम नहीं कर रहा है लेकिन मेरे पास फ़ायरफ़ॉक्स अभी इंस्टॉल नहीं है।

आशा है कि किसी को भी अगर इस पुराने धागा :)

/जम्मू का एक प्रकार था मदद करता है

0

मैं एक्सप्रेस 4. के साथ ऐसा करने मेरा मानना ​​है कि यह ow यह निराकरण के साथ क्या करना है एक ही मुद्दा था अनुरोध पैराम्स। समाधान यह सुनिश्चित करना है कि params उदाहरण के लिए हल हो जाएं उदाहरण के लिए उन्हें if ब्लॉक में जांचें।

app.get('/:conversation',(req, res) => { 
    let url = req.params.conversation; 

//Only handle request when params have resolved 
    if(url){ 
res.redirect(301, 'http://'+ url + '.com') 
    } 

}) 
संबंधित मुद्दे