Come ispezionare FormData?


221

Ho provato console.loge ripetutamente usando for in.

Qui è il riferimento MDN su FormData.

Entrambi i tentativi sono in questo violino .

var fd = new FormData(),
    key;

// poulate with dummy data
fd.append("key1", "alskdjflasj");
fd.append("key2", "alskdjflasj");

// does not do anything useful
console.log(fd);

// does not do anything useful   
for(key in fd) {
    console.log(key);
}

Come posso controllare i dati del modulo per vedere quali chiavi sono state impostate.


Non è solo una funzione di Firefox?
Shiplu Mokaddim,


1
Vuoi fare key of fdinvece di key in fd. Non so perché questo sia tecnicamente ancora, ma funziona. Documentazione qui .
cilphex,

Quindi, non esiste un plugin Chrome o Firefox per mostrare i dati dei moduli senza aggiungere alcun codice al tuo javascript?
natel

Risposte:


298

Metodo aggiornato:

A partire da marzo 2016, le versioni recenti di Chrome e Firefox ora supportano l'utilizzo FormData.entries()per ispezionare FormData. Fonte .

// Create a test FormData object
var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

// Display the key/value pairs
for (var pair of formData.entries()) {
    console.log(pair[0]+ ', ' + pair[1]); 
}

Grazie a Ghost Echo e rloth per segnalato!

Vecchia risposta:

Dopo aver visto questi articoli di Mozilla , sembra che non ci sia modo di estrarre dati da un oggetto FormData. Puoi usarli solo per creare FormData da inviare tramite una richiesta AJAX.

Ho anche trovato questa domanda che afferma la stessa cosa: FormData.append ("chiave", "valore") non funziona .

Un modo per aggirare questo sarebbe costruire un dizionario normale e poi convertirlo in FormData:

var myFormData = {
    key1: 300,
    key2: 'hello world'
};

var fd = new FormData();
for (var key in myFormData) {
    console.log(key, myFormData[key]);
    fd.append(key, myFormData[key]);
}

Se desideri eseguire il debug di un semplice oggetto FormData, puoi anche inviarlo per esaminarlo nella console delle richieste di rete:

var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(fd);

Bene, sarebbe una buona idea, vorrei avvolgere FormData in un metodo di supporto e quindi passare l'oggetto letterale. Quindi salvalo nel caso in cui desideri guardarlo più tardi.

2
le recenti versioni di Chrome e Firefox forniscono ora un iteratore:myFormData.entries()
rloth

1
Al momento della scrittura, non era possibile accedere a FormData. Ora ho aggiornato la risposta per riflettere la nuova API. Grazie per il testa a testa!
Ryan Endacott,

2
Penso che sia anche utile notare che è possibile afferrare i dati di un modulo esistente utilizzando: var formData = new FormData(formElement). Se si utilizza JQuery, è possibile quindi fare questo: var formData = new FormData($('#formElementID')[0]). Quindi aggiungere i dati secondo necessità.
Peter Valadez,

Per l'iterazione FormDatain IE / Bordo: stackoverflow.com/questions/37938955/...
cs_pupil

79

Risposta breve

console.log(...fd)

Risposta più lunga

Se desideri ispezionare l'aspetto del corpo non elaborato, puoi utilizzare il costruttore Response (parte dell'API di recupero)

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

new Response(fd).text().then(console.log)

Alcuni di desiderio suggeriscono la registrazione ogni voce di voci, ma la console.logpuò anche prendere più argomenti
console.log(foo, bar)
Per prendere qualsiasi numero di argomenti è possibile utilizzare il applymetodo e chiamarlo come tale: console.log.apply(console, array).
Ma esiste un nuovo modo ES6 per applicare argomenti con l' operatore spread e l'iteratore
console.log(...array) .

Sapendo questo, e il fatto che FormData e entrambi gli array abbiano un Symbol.iteratormetodo nel suo prototipo, potresti semplicemente farlo senza dover passare su di esso, o chiamare .entries()per avere il controllo dell'iteratore

var fd = new FormData

fd.append("key1", "value1")
fd.append("key2", "value2")

console.log(...fd)


2
operatore di diffusione !! Eccellente e davvero semplice, visualizza i formdata come formato psson di Json. Grazie - per la New Response, ho appena ricevuto [[PromiseStatus]]: "pending"
platinums

5
Oppure dalla console web scrivi[...fd]
Endless il

hells bells - l'hai fatto di nuovo @Endless. quale metodo viene chiamato usando le parentesi?
platino

bene, le parentesi sono solo un array e ne stai creando uno nuovo. ...Distribuisci le voci con da formdata per creare il nuovo array con tutti gli elementi, quindi la console scarica il risultato dall'ultima riga che hai scritto
Endless

1
la migliore risposta qui - dovrebbe rimuovere tutto il gumpf e lasciare solo il secondo frammento di codice - molte grazie
danday74

39

Io uso il formData.entries()metodo Non sono sicuro di tutto il supporto del browser, ma funziona bene su Firefox.

Tratto da https://developer.mozilla.org/en-US/docs/Web/API/FormData/entries

// Create a test FormData object
var formData = new FormData();
formData.append('key1','value1');
formData.append('key2','value2');

// Display the key/value pairs
for (var pair of formData.entries())
{
 console.log(pair[0]+ ', '+ pair[1]); 
}

C'è anche formData.get()e formData.getAll()con un supporto browser più ampio, ma portano solo i valori e non la chiave. Vedi il link per maggiori informazioni.


3
È finalmente facile esaminare gli oggetti FormData! Questo ha funzionato per me dopo l'aggiornamento a Chrome 50 (rilasciato ieri, 13 aprile 2016).
jbb

2
var paio di errori di lancio per me. Sostituirlo con in sembra almeno stampare qualcosa, tuttavia non è una chiave o un valore come gli stati MDN.
Johnny Welker,

1
ES6:for (const pair of formData.entries()) { console.log(pair[0], pair[1]); }
2540625

per ... of is ES6feature e funzionerà solo in alcuni browser. Esclusa qualsiasi versione di IE secondo MDN
Zanshin13,

per of non è supportato nella maggior parte di IE. supportato solo in IE edge
mingca il

11

In alcuni casi, l'uso di:

for(var pair of formData.entries(){... 

è impossibile.

Ho usato questo codice in sostituzione:

var outputLog = {}, iterator = myFormData.entries(), end = false;
while(end == false) {
   var item = iterator.next();
   if(item.value!=undefined) {
       outputLog[item.value[0]] = item.value[1];
   } else if(item.done==true) {
       end = true;
   }
    }
console.log(outputLog);

Non è un codice molto intelligente, ma funziona ...

Spero sia di aiuto.


1
Capovolgerei l'istruzione if in modo che controlli doneprima. doneè la bandiera autorevole; se doneè falso o non specificato, valueè un elemento valido (anche se contiene il valore undefined). Quando doneè presente e true, la fine della sequenza è stata raggiunta e valuenon è nemmeno necessario definirla. Se valueè definito quando doneè true, allora valueviene interpretato come il valore di ritorno dell'iteratore. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Triynko

10

Quando lavoro su Angular 5+ (con TypeScript 2.4.2), ho provato come segue e funziona tranne un errore di controllo statico ma for(var pair of formData.entries())non funziona.

formData.forEach((value,key) => {
      console.log(key+" "+value)
});

Controlla su Stackblitz


+ non compatibile con IE 11 (value, key) => {... Mal di testa !
Delphine,

1
simpatico. voglio darti 10 stelle.
Abdullah Nurum,

10

Metodo semplice

Ho usato questo codice in 8 angolare

var formData = new FormData();
formData.append('key1', 'value1');
formData.append('key2', 'value2');

 formData.forEach((value,key) => {
    console.log(key+value)
     });

9

Soluzioni ES6 +:

Per vedere la struttura dei dati del modulo:

console.log([...formData])

Per vedere ogni coppia chiave-valore:

for (let [key, value] of formData.entries()) {
  console.log(key, ':', value);
}

2

Ecco una funzione per registrare le voci di un oggetto FormData sulla console come oggetto.

export const logFormData = (formData) => {
    const entries = formData.entries();
    const result = {};
    let next;
    let pair;
    while ((next = entries.next()) && next.done === false) {
        pair = next.value;
        result[pair[0]] = pair[1];
    }
    console.log(result);
};

Documento MDN attivo .entries()

Documento MDN su .next()e.done


2
  function abc(){ 
    var form = $('#form_name')[0]; 
        var formData = new FormData(form);
        for (var [key, value] of formData.entries()) { 
            console.log(key, value);
        }
        $.ajax({
            type: "POST",
            url: " ",
            data:  formData,
            contentType: false,
            cache: false,
            processData:false,
            beforeSend: function() {

            },
            success: function(data) {


            },

       });
}

+ non compatibile con IE 11 for...of... Mal di testa !
Delphine,

2

Devi capire che FormData::entries()restituisce un'istanza di Iterator.

Prendi questo modulo di esempio:

<form name="test" id="form-id">
    <label for="name">Name</label>
    <input name="name" id="name" type="text">
    <label for="pass">Password</label>
    <input name="pass" id="pass" type="text">
</form>

e questo loop JS:

<script>
    var it = new FormData( document.getElementById('form-id') ).entries();
    var current = {};
    while ( ! current.done ) {
        current = it.next();
        console.info( current )
    }
</script>

2

In Angular 7 ho ottenuto voci sulla console usando la riga di codice sottostante.

formData.forEach(entries => console.log(entries));

2

Già risposto ma se si desidera recuperare i valori in modo semplice da un modulo inviato, è possibile utilizzare l'operatore di diffusione combinato con la creazione di una nuova mappa iterabile per ottenere una bella struttura.

new Map([...new FormData(form)])


sebbene - questo ha un problema con inp_nam [some_mult] [] - si vede solo l'ultimo
halfbit

2

in typeScriptof angular 6, questo codice funziona per me.

var formData = new FormData();
formData.append('name', 'value1');
formData.append('name', 'value2');
console.log(formData.get('name')); // this is return first element value.

o per tutti i valori:

console.log(formData.getAll('name')); // return all values

1

Prova questa funzione:

function formDataToObject(formData) {
  return Array.from(formData.entries()).reduce((old, pair) => ({
    ...old,
    [pair[0]]: pair[1],
  }), {});
}

2
Sebbene questo frammento di codice possa essere la soluzione, includendo una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che in futuro stai rispondendo alla domanda dei lettori e che queste persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Johan

0

L' MDN suggerisce il seguente modulo:

let formData = new FormData();
formData.append('name', 'Alex Johnson')
for(let keyValuePair of formData.entries()){
    console.log(keyValuePair); //has form ['name','Alex Johnson']
}

In alternativa

for (let [key, value] of formData.entries()) {
 console.log(key, ':', value);
}

Prendi in considerazione l'aggiunta di ES + Polyfill , nel caso in cui il browser o l'ambiente non supportino le ultime API JavaScript e FormData.

Spero che aiuti.


Hai testato questo codice prima di eseguirlo? formData()dovrebbe essere in maiuscolo, in primo luogo. Inoltre, il tuo for ... of loopin linea 3 chiama implicitamente FormData.entries, puoi vederlo eseguendo new FormData()[Symbol.iterator]nella console. Infine, se lo esegui in browser come Edge, che non supportano FormData.entries, otterrai risultati imprevisti, come la stampa dei nomi dei metodi disponibili sull'oggetto FormData:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakedgun
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.