Búsqueda de sitios web

typescript - Firestore no logró fusionar un array de elementos con otro array usando FieldValue.arrayUnion()


Tengo una función en la nube que se invoca cuando ocurre un cierto evento. En la función obtendré un arreglo de cadenas, por ejemplo let h:string[]=["foo","bar","baz"], algo similar a esto. Cuando intento actualizar un campo de tipo arreglo dentro de mi documento de esta manera names: admin.firestore.FieldValue.arrayUnion(h), falla al hacerlo y arroja ese error en la consola

Error: 3 INVALID_ARGUMENT: Cannot convert an array value in an array value.
    at Object.exports.createStatusError (/srv/node_modules/grpc/src/common.js:87:15)
    at Object.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:1188:28)
    at InterceptingListener._callNext (/srv/node_modules/grpc/src/client_interceptors.js:564:42)
    at InterceptingListener.onReceiveStatus (/srv/node_modules/grpc/src/client_interceptors.js:614:8)
    at callback (/srv/node_modules/grpc/src/client_interceptors.js:841:24)

Pero si cambio el código a esto names: admin.firestore.FieldValue.arrayUnion("foo","bar","baz") funciona, pero en mi función, recibo un arreglo, no el formato anterior, así que falla

Aquí está lo que quiero. Tengo un campo de arreglo en el documento, llamémoslo nombres. Cuando se active la función y obtenga el arreglo de él, quiero agregar este arreglo al arreglo de nombres existente

antes de agregar el arreglo names : ["test","test2"]

después de añadir el array names : ["test","test2","foo","bar","baz"]

¿Cómo arreglar eso? Estoy usando TypeScript 3.0.1

Respuesta #1

La función arrayUnion tiene un valor de arreglo en su definición, necesitas agregar tu arreglo a este valor de arreglo, en JavaScript o TypeScript puedes usar ...(NombreArreglo) para unir.

items : any[] = [1,2,4,5,67,8];
admin.firestore.FieldValue.arrayUnion(...items);

Respuesta #2

Si admin.firestore.FieldValue.arrayUnion("foo","bar","baz") funciona, entonces podemos usar una función llamada apply que existe como miembro de objeto en cada función... Es una muy útil de conocer. Apply 'aplica' un solo arreglo de argumentos a la función (en lugar de argumentos separados por comas) y la invoca.

Por lo tanto, la solución es:

admin.firestore.FieldValue.arrayUnion.apply(null,h)