¿Cómo inspeccionar FormData?

220

He intentado console.logy recorrerlo usando for in.

Aquí está la referencia de MDN en FormData.

Ambos intentos están en este violín .

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

¿Cómo puedo inspeccionar los datos del formulario para ver qué claves se han configurado?

Penny Liu
fuente
¿No es una característica única de Firefox?
Shiplu Mokaddim
1
Quieres hacer en key of fdlugar de key in fd. No sé por qué esto es técnicamente todavía, pero funciona. Documentación aquí .
cilphex
Entonces, ¿no hay un complemento de Chrome o Firefox para mostrar los datos del formulario sin agregar ningún código a su JavaScript?
natel

Respuestas:

298

Método actualizado:

A partir de marzo de 2016, las versiones recientes de Chrome y Firefox ahora admiten el uso FormData.entries()para inspeccionar FormData. Fuente .

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

¡Gracias a Ghost Echo y a Rloth por señalar esto!

Vieja respuesta:

Después de mirar estos artículos de Mozilla , parece que no hay forma de obtener datos de un objeto FormData. Solo puede usarlos para crear FormData para enviar a través de una solicitud AJAX.

También acabo de encontrar esta pregunta que dice lo mismo: FormData.append ("clave", "valor") no funciona .

Una forma de evitar esto sería crear un diccionario regular y luego convertirlo a 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]);
}

Si desea depurar un objeto FormData simple, también puede enviarlo para examinarlo en la consola de solicitud de red:

var xhr = new XMLHttpRequest;
xhr.open('POST', '/', true);
xhr.send(fd);
Ryan Endacott
fuente
Bueno, esa sería una buena idea, envolvería FormData en un método auxiliar y luego pasaría el objeto literal. Luego guárdelo en caso de que quiera verlo más tarde.
2
Las versiones recientes de Chrome y Firefox ahora proporcionan un iterador:myFormData.entries()
rloth
1
Al momento de escribir, no había forma de acceder a FormData. Ahora he actualizado la respuesta para reflejar la nueva API. Gracias por la cabeza rloth!
Ryan Endacott
2
Creo que es también útil observar que se puede agarrar los datos de un formulario existente usando: var formData = new FormData(formElement). Si está utilizando jQuery, por lo tanto, se puede hacer esto: var formData = new FormData($('#formElementID')[0]). Luego agregue datos según sea necesario.
Peter Valadez
Para iterar FormDataen IE / Edge: stackoverflow.com/questions/37938955/…
cs_pupil
78

Respuesta corta

console.log(...fd)

Respuesta más larga

Si desea inspeccionar cómo se vería el cuerpo sin procesar, entonces podría usar el constructor de Respuesta (parte de la API de búsqueda)

var fd = new FormData

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

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

Algunos de deseo sugieren registrar cada entrada de las entradas, pero el console.logtambién puede tomar varios argumentos
console.log(foo, bar)
Para tomar cualquier número de argumentos que podría utilizar el applymétodo y llamarlo como tal: console.log.apply(console, array).
Pero hay una nueva forma ES6 de aplicar argumentos con el operador extendido y el iterador
console.log(...array).

Sabiendo esto, y el hecho de que FormData y ambas matrices tienen un Symbol.iteratormétodo en su prototipo, simplemente puede hacer esto sin tener que recorrerlo o llamar .entries()para obtener la retención del iterador

var fd = new FormData

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

console.log(...fd)

Sin fin
fuente
2
operador de propagación !! Excelente y realmente simple, muestra los datos en formato psuedo Json. Gracias - por la Nueva Respuesta, acabo de recibir [[PromiseStatus]]: "pendiente"
platinos
55
O desde la consola web simplemente escriba[...fd]
Endless
infiernos - lo hiciste de nuevo @Endless. ¿Qué método se llama usar los corchetes?
platinos
bueno, los corchetes son solo una matriz y estás creando uno nuevo. Está extendiendo las entradas ...desde formdata para crear la nueva matriz con todos los elementos, luego la consola simplemente descarga el resultado de la última línea que escribió
Endless
1
mejor respuesta aquí - debería eliminar todo el gumpf y dejar el segundo fragmento de código - muchas gracias
danday74
39

Yo uso el formData.entries()método No estoy seguro de todo el soporte del navegador, pero funciona bien en Firefox.

Tomado de 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]); 
}

También existe formData.get()y formData.getAll()con un soporte de navegador más amplio, pero solo muestran los Valores y no la Clave. Vea el enlace para más información.

Echo fantasma
fuente
3
¡Finalmente es fácil mirar dentro de los objetos FormData! Esto funcionó para mí después de actualizar a Chrome 50 (lanzado ayer, 13 de abril de 2016).
jbb
2
Var par de errores de lanzamiento para mí. Reemplazarlo con in parece imprimir algo al menos, sin embargo, no es una clave o un valor como los estados MDN.
Johnny Welker
1
ES6:for (const pair of formData.entries()) { console.log(pair[0], pair[1]); }
2540625
for ... of es una ES6función y funcionará solo en ciertos navegadores. Excluyendo cualquier versión de IE según MDN
Zanshin13
for of no es compatible con la mayoría de IE. solo admitido en IE edge
mingca
11

En ciertos casos, el uso de:

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

es imposible.

He usado este código en reemplazo:

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

No es un código muy inteligente, pero funciona ...

Espero que sea de ayuda.

Luc
fuente
1
Voltearía la declaración if para que se verifique doneprimero. donees la bandera autorizada; si donees falso o no se especifica, entonces valuees un elemento válido (incluso si contiene el valor undefined). Cuando doneestá presente y true, se ha alcanzado el final de la secuencia, y valueni siquiera tiene que definirse. Si valuese define cuando donees true, entonces valuese interpreta como el valor de retorno del iterador. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Triynko
10

Cuando estoy trabajando en Angular 5+ (con TypeScript 2.4.2), intenté lo siguiente y funciona excepto un error de comprobación estática pero for(var pair of formData.entries())tampoco funciona.

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

Comprobar en Stackblitz

Gurkan Yesilyurt
fuente
+ no es compatible con IE 11 (value, key) => {... Un dolor de cabeza !
Delphine el
1
bonito. Quiero darte 10 estrellas.
Abdullah Nurum
10

Método fácil

Usé este código en angular 8

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

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

Soluciones ES6 +:

Para ver la estructura de los datos del formulario:

console.log([...formData])

Para ver cada par clave-valor:

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

Aquí hay una función para registrar entradas de un objeto FormData en la consola como un objeto.

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

MDN doc en .entries()

MDN doc .next()y.done

2540625
fuente
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) {


            },

       });
}
turkane espumoso
fuente
+ no es compatible con IE 11 for...of... Un dolor de cabeza !
Delphine
2

Tienes que entender que FormData::entries()devuelve una instancia de Iterator.

Tome este formulario de ejemplo:

<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>

y este bucle JS:

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

En angular 7 obtuve entradas en la consola usando la siguiente línea de código.

formData.forEach(entries => console.log(entries));
Yousuf
fuente
2

Ya respondió, pero si desea recuperar valores de una manera fácil de un formulario enviado, puede usar el operador de propagación combinado con la creación de un nuevo Mapa iterable para obtener una estructura agradable.

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

ngr
fuente
aunque - esto tiene un problema con inp_nam [some_mult] [] - solo se ve el último
halfbit
2

en typeScriptde angular 6, este código está trabajando para mí.

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

o para todos los valores:

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

Prueba esta función:

function formDataToObject(formData) {
  return Array.from(formData.entries()).reduce((old, pair) => ({
    ...old,
    [pair[0]]: pair[1],
  }), {});
}
Mauro
fuente
2
Si bien este fragmento de código puede ser la solución, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
Johan
0

El MDN sugiere la siguiente forma:

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

Alternativamente

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

Considere agregar ES + Polyfills , en caso de que el navegador o el entorno no sean compatibles con la última versión de JavaScript y FormData API.

Espero que esto ayude.

Manioz
fuente
¿Probaste este código antes de ejecutarlo? formData()debe ser capitalizado, en primer lugar. Además, su for ... of looplínea 3 está llamando implícitamente a FormData.entries, puede ver esto ejecutándose new FormData()[Symbol.iterator]en la consola. Finalmente, si ejecuta esto en navegadores como Edge, que no son compatibles con FormData.entries, obtendrá resultados inesperados, como imprimir los nombres de métodos disponibles en el objeto FormData:>>> var data = new FormData(); data.append("Foo", "Bar"); for(let x in data){console.log(x)}; <<< 'append'
Lovethenakedgun