2013-06-21 12 views
5

Come posso ottenere l'accesso ai dati POST in una richiesta, se l'Express bodyParser non attiva?Come analizzare la richiesta HTTP con un tipo di contenuto mancante in Express/NodeJs, assumendo un tipo di contenuto predefinito?

var server = express(); 
server.use(express.bodyParser()); 
server.post('/api/v1', function(req, resp) { 
    var body = req.body; 
    //if request header does not contain 'Content-Type: application/json' 
    //express bodyParser does not parse the body body is undefined 
    var out = { 
    'echo': body 
    }; 
    resp.contentType('application/json'); 
    resp.send(200, JSON.stringify(out)); 
}); 

Nota: in ExpressJs 3.x + req.body non è disponibile automaticamente, e richiede bodyParser da attivare.

Se un'intestazione del tipo di contenuto non è impostata, è possibile specificare un tipo di contenuto predefinito di application/json e attivare lo bodyParser?

Altrimenti è possibile accedere ai dati POST utilizzando il modo nodo nudo all'interno di questa funzione POST express?

(ad es req.on('data', function...)

+2

basta usare 'req.on ('data')' oppure fare 'req.headers ['content-type'] = req.headers ['content-type'] || 'application/json'' prima del parser del corpo, ma in realtà questo è un errore del client. –

+0

@ JonathanOng grazie. Sì, lo so che si tratta di un errore del client - solo cercando di aggirare il problema. Come faccio a fare qualcosa prima che il parser del corpo entri in gioco? AFAICT, è già stato attivato dal momento in cui viene inserita questa funzione di richiamata PUT espressa. – bguiz

risposta

12

hai un sacco di opzioni tra cui invocare manualmente l'espresso (collegare, in realtà) le funzioni middleware te (davvero, andate a leggere il codice sorgente. Sono solo le funzioni e non c'è nessuna magia profonda confondervi). Quindi:

function defaultContentTypeMiddleware (req, res, next) { 
    req.headers['content-type'] = req.headers['content-type'] || 'application/json'; 
    next(); 
} 

app.use(defaultContentTypeMiddleware); 
app.use(express.bodyParser()); 
+0

grazie per la risposta, controllando che dal momento che stiamo usando il tipo di contenuto direttamente come hash, se la capitalizzazione avrà effetto su questo? cioè 'req.headers ['content-type']' vs 'req.headers ['Content-Type']'? – bguiz

+0

Sono minuscole per te. http://nodejs.org/docs/latest/api/all.html#all_message_headers –

+0

@ Peter Lyons Se non si impostano le proprietà dell'intestazione in questo modo, non sembra avere alcun effetto su 'bodyParser'. Grazie per avermi dato l'idea di scrivere il mio middleware però - non so perché non mi è venuto in mente di farlo da solo - ma alla fine quello che ho finito è stato scrivere il mio middleware, che era essenzialmente un wrapper minimale attorno a 'req.on ('data', function ...' e 'JSON.parse'. +1 e controlla te! – bguiz

3

Io uso questo middleware, prima che bodyParser passi, il che può essere d'aiuto. Sbircia il primo byte del flusso di richieste e fa un'ipotesi. Questa particolare applicazione gestisce solo flussi di testo XML o JSON.

app.use((req,res, next)=>{ 
    if (!/^POST|PUT$/.test(req.method) || req.headers['content-type']){ 
     return next(); 
    } 
    if ((!req.headers['content-length'] || req.headers['content-length'] === '0') 
      && !req.headers['transfer-encoding']){ 
     return next(); 
    } 
    req.on('readable',()=>{ 
     //pull one byte off the request stream 
     var ck = req.read(1); 
     var s = ck.toString('ascii'); 
     //check it 
     if (s === '{' || s==='['){req.headers['content-type'] = 'application/json';} 
     if (s === '<'){req.headers['content-type'] = 'application/xml'; } 
     //put it back at the start of the request stream for subsequent parse 
     req.unshift(ck); 
     next(); 
    }); 
}); 
Problemi correlati