2012-02-02 7 views
30

Nel tentativo di fermare solo la richiesta POST dopo che ho salvato un documento al DB, vale a dire:Come terminare una risposta POST express.js/node?

app.post('/blah'), function(req,res){ 
//my code does a bunch of stuff 

res.what do i put here to tell the client browser to just... stop the POST 
} 

Al momento im semplicemente utilizzando res.redirect('back') che funziona, ma l'aggiornamento della pagina è totalmente arbitraria e vorrei preferisco che non sia successo. Ho avuto un tentativo a res.end(); ma che invia il client a una pagina vuota ...

Grazie in anticipo.

edit:

Non credo mi sono fatto abbastanza chiaro in quello che sto facendo mi dispiace.

Forse la sua cattiva pratica, ma questo è quello che accade:

  1. POST iniziati banca dati funzione di risparmio

  2. Browser siede intorno in attesa di una risposta

  3. Quando il suo buono e pronto, il obj viene salvato nel DB, quindi una richiamata attiva una funzione NowJS, che aggiunge l'elemento alla vista (per tutti)

ho fatto in questo modo di essere non bloccante (così ho pensato)

+0

res.end() o con res.json se si restituisce una risposta json. – Prashanth

risposta

40

È possibile utilizzare res.end e passare una stringa che si desidera inviare al client:

res.end('It worked!'); 

In alternativa, si potrebbe render a view e poi terminare la risposta:

res.render('blah.jade'); 
res.end(); 

Tutto ciò che detto, il reindirizzamento del cliente è in realtà la migliore pratica. Fa in modo che quando colpiscono il pulsante Indietro nel loro browser, possono tornare indietro senza ottenere alcun popup "POST required" o simili. Questo è il pattern POST/redirect e puoi leggere ulteriori informazioni al riguardo a http://en.wikipedia.org/wiki/Post/Redirect/Get.

+3

Non è necessario res.end dopo res.render. Lo schema POST/redirect è la strada da percorrere, a meno che il POST non sia tramite JSON o XMLHttpRequest. È possibile verificare entrambi, e se la richiesta ha esito positivo, è sufficiente inviare res.json (200) o res.send (200) (o qualche altro codice di risposta RESTful a 200 intervalli). – danmactough

+0

res.end ('Ha funzionato!'); porta l'utente a una pagina che dice "Ha funzionato!" –

+0

Ho la stessa domanda. Non voglio che rediect a qualsiasi altra pagina o aggiornare la pagina corrente. C'è un modo per farlo? res.redirect ('back') o res.end() sono entrambi aggiornati o inviano l'utente a un'altra pagina. Voglio tenerlo sulla stessa pagina. – Tenz

0

Il browser client è in attesa di una risposta. Quindi, perché non dargli uno con qualcosa come res.send('<p>Thank you</p>'); o una bella visualizzazione di rendering?

Il motivo res.end() invia il client a una pagina vuota è che non si sta dando al client nulla da visualizzare.

+0

Quello che sto facendo è far scattare NowJS per aggiornare asincronamente la pagina e aggiornare il mio database. Quindi la pagina è già stata aggiornata con il nuovo contenuto, il browser semplicemente non lo conosce. Ho aggiornato la mia domanda per riflettere questo. –

1

Se è possibile modificare il codice lato client per effettuare la richiesta di posta tramite AJAX, è possibile utilizzare semplicemente res.end().

Il problema qui è che quando il browser effettua una richiesta POST (non tramite AJAX), non interessa più alla pagina corrente. Si aspetta una nuova pagina, quindi caricherà una nuova pagina. Questo è puramente con il browser, e non credo che ci sia attualmente un modo per aggirare il problema.

In generale, dovresti semplicemente utilizzare una richiesta POST AJAX se puoi.

3

Sebbene sia possibile utilizzare il metodo di end sottostante preso in prestito dal modulo HTTP di Node, Express.js ha il proprio metodo che chiama sendend se del caso:

/** 
* Send a response. 
* 
* Examples: 
* 
*  res.send(new Buffer('wahoo')); 
*  res.send({ some: 'json' }); 
*  res.send('<p>some html</p>'); 
*  res.send(404, 'Sorry, cant find that'); 
*  res.send(404); 
* 
* @param {Mixed} body or status 
* @param {Mixed} body 
* @return {ServerResponse} 
* @api public 
*/ 
res.send = function(body){ 
    . 
    . 
    . 

    // respond 
    this.end(head ? null : body); 
    return this; 
}; 
+0

come si può rendere express non chiamare il metodo 'end' –

0

Il modo migliore per concludere il percorso di routing per Express senza nuova pagina o che mai il mess espresso vuole che tu non stia sulla pagina corrente anche se hai una tua ragione è usare window.stop, ad esempio un modulo, usi javascript per gestire l'invio, il timeout dovrebbe essere sufficiente per garantire i dati vengono inviati come metodo POST.

document.myform.mysubmit.click() 
    setTimeout(function(){ 
     window.stop() 
    }, 3000); 
3

Per riferimento futuro, si può anche fare:

res.redirect('back'); 

Fondamentalmente questo reindirizza semplicemente il browser torna alla schermata di richiesta proviene, in altre parole "rinfrescante" esso. È hacky e vorrei che ci fosse un modo migliore, ma funziona.