2012-10-31 22 views
9

Per imparare node.js sto creando una piccola app che ottiene alcuni feed rss archiviati in mongoDB, li elabora e crea un singolo feed (ordinato per data) da questi.La richiesta express viene richiamata due volte

Analizza un elenco di ~ 50 feed RSS, con ~ 1000 articoli del blog, quindi è piuttosto lungo analizzare il tutto, quindi ho impostato il seguente req.connection.setTimeout(60*1000); per ottenere un tempo sufficiente per recuperare e analizzare tutti i feed.

Tutto funziona abbastanza bene, ma la richiesta viene chiamata due volte. (Ho controllato con wireshark, non penso che si tratti di favicon qui).

Davvero non capisco.

È possibile testare qui: http://mighty-springs-9162.herokuapp.com/feed/mde/20 (dovrebbe creare un feed RSS con gli ultimi 20 articoli su "mde").

Il codice è qui: https://github.com/xseignard/rss-unify

E se ci concentriamo sui bit interessanti:

Ho un percorso definito in questo modo: app.get('/feed/:name/:size?', topics.getFeed);

E il topics.getFeed è come questo:

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); 
} 

Quindi niente di eccezionale, ma ancora, questa funzione di getFeed viene chiamata due volte.

Cosa c'è che non va? Qualche idea?

+0

problema più comune è che da qualche parte ci si dimentica di usare 'return' –

+0

Ciao mvbl-FST, che non si ottiene quello che si intende per dimenticare' '' return'''. Puoi spiegare di più? –

+0

Potrei sbagliarmi riguardo a quanto sopra e in questo codice nulla si distingue per farlo eseguire due volte (eccetto favicon.ico ma hai detto che è fuori questione). L'unica cosa che farei è 'return findTopicByName (name, callback);'. Ma piuttosto sicuro che non sarà di aiuto. –

risposta

9

Questo mi ha infastidito per molto tempo. Molto probabilmente è l'estensione Firebug che sta inviando un duplicato di ogni richiesta GET in background. Prova a disattivare Firebug per assicurarti che non sia questo il problema.

+0

Questo era il problema anche nel mio caso. GET request to http: // localhost: 3000/tracks è stato chiamato una volta, GET request to http: // localhost: 3000/tracks/post è stato chiamato due volte. Quando ho disattivato Firebug (in Chrome), anche la seconda richiesta è stata chiamata una volta. –

+0

Questo è successo anche a me, ma con gli strumenti di chrome dev. Mi stavo strappando i capelli cercando di capire perché. – Jeffpowrs

+0

Ho lo stesso problema e non è sicuramente firebug. È in qualche modo correlato a una richiesta di risposta nel mio caso, perché la mia richiesta viene chiamata due volte esegue un sacco di elaborazione e invia risposta dopo 3-4 minuti. E la seconda richiesta non si verifica se rispondo semplicemente in fretta senza che siano coinvolti i calcoli. – user619271

1

potrebbe essere necessario aumentare ulteriormente il timeout. Non ho visto la fonte espressa ma suona appena in timeout, riprova.

2

Se si dispone di favicon sul proprio sito, rimuoverlo e riprovare. Se il problema è stato risolto, refactoring your favicon url

0

Ho incontrato lo stesso problema. Poi ho provato ad aggiungere il reso, non ha funzionato. Ma funziona quando aggiungo return res.redirect ('/ path');

2

Sto facendo più o meno la stessa cosa ora e ho notato la stessa cosa.

sto testando il mio server inserendo l'indirizzo api in cromo in questo modo:

http://127.0.0.1:1337/links/1

server di miei Node.js viene poi risponde con un oggetto JSON a seconda della id.

Ho impostato un log della console nel metodo get e ho notato che quando cambio l'id nella barra degli indirizzi di chrome invia una richiesta (prima di premere invio per inviare effettivamente la richiesta) e il server accetta un'altra richiesta dopo che I in realtà premi invio. Questo succede con e senza avere la console di chrome dev aperta.

IE 11 non sembra funzionare allo stesso modo, ma non ho Firefox installato al momento.

Speranza che aiuta qualcuno, anche se questa è stata una specie di vecchio filo :)

/J

0

Ho avuto lo stesso problema facendo questo con espresso 4. Credo che abbia a che fare con ow si risolve richiesta parametri La soluzione è garantire che il tuo params venga risolto, ad esempio controllandoli in un blocco 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') 
    } 

}) 
Problemi correlati