I am using Firebase functions to create Algolia indices for the full-text search app
here is how I create an index when someone post on Firebase:
export const onListingCreated = functions.firestore
.document('Listings/{listingId}')
.onCreate((snap, ctx) => {
return index.saveObject({
objectID: snap.id,
...snap.data(),
})
})
//...snap.data() has - AdTitle:"House" Email:"example@gmail.com"
//this works well the index is created like this on algolia
But I want to avoid sharing the email
I tried it Like this:
export const onListingCreated = functions.firestore
.document('Listings/{listingId}')
.onCreate((snap, ctx) => {
return index.saveObject({
objectID: snap.id,
...snap.data().AdTitle,
})
})
//on algolia the index was created like:
//0:H
//1:o
//2:u
//3:s
//4:e
I wanted to be AdTitle: "House"
Is there a way to avoid sharing sensitive information on algolia?
In your case snap.data().AdTitle
is the string House
and you are spreading over the string which makes your output object look like that.
Once you spread a string it is converted to an array. For example House
is converted to ["H", "o", "u", "s", "e"]
Now in javascript arrays are also type of object so when you try {...["H", "o", "u", "s", "e"]}
it takes ["H", "o", "u", "s", "e"]
as { 0: "H", 1: "o", 2: "u", 3: "s", 4: "e" }
and spreads over that object giving what you have mentioned
let randomString = 'House'
let obj = {...randomString} //converts to array and then spreads the array
console.log(obj)
let arr = [...randomString]
console.log(arr)
let obj2 = {...arr}
console.log(obj2) //obj and obj2 give same result
Instead what you can do is
let randomString = 'House'
let obj = {AdTitle: randomString}
console.log(obj)
Or you can delete the Email
property from the data object and then use your usual implementation
.onCreate((snap, ctx) => {
const dataObj = snap.data()
delete dataObj.Email
return index.saveObject({
objectID: snap.id,
...dataObj,
})
})