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


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

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)


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.


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.


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


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

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

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


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


            },

       });
}

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

2

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

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

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


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

1

Prueba esta función:

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

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.


¿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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.