'Duplicate data saving on MongoDB
Hello I'm having a problem on my function save on my react project.
onSubmit={async (data, { setSubmitting, resetForm }) => {
for (var i = 0; i < selectedImageFiles.length; i++) {
const urlLink = await generateUploadUrl(selectedImageFiles[i].type);
const to_base64 = (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
});
let blob = await to_base64(selectedImageFiles[i]);
let binary = atob(blob.split(",")[1]);
let array = [];
for (var x = 0; x < binary.length; x++) {
array.push(binary.charCodeAt(x));
}
let blobData = new Blob([new Uint8Array(array)], {
type: selectedImageFiles[i].type,
});
const uploadImageLink = await uploadImage(urlLink, blobData);
const newUploadImageLink = uploadImageLink.url.split("?")[0];
let productData = {
...data,
shopId: userShop._id,
images: selectedImageFiles,
category: collectCategoryId()[0],
};
addProduct(productData, userShop._id, newUploadImageLink).then(
(response) => {
if (response.status === 200) {
response.json().then((result) => {
setSubmitting(false); });
} else {
response.json().then((result) => {
setSubmitting(false);
});
}
}
);
}
}}
>
When I upload 2 files it also create 2 files on my database with same image link on both.
What I want is to create 1 data on database then the images.url must be different link from what I uploaded.
data number 1 that is inserted
{
"_id": {
"$oid": "62395b2faff15038acab7d0e"
},
"images": [{
"url": "https://devs.s3.ap-southeast-1.amazonaws.com/1647926063980.png",
}, {
"url": "https://devs.s3.ap-southeast-1.amazonaws.com/1647926063980.png",
}],
}
data number 2 that is inserted
{
"_id": {
"$oid": "62395b2faff15038acab7d0e"
},
"images": [{
"url": "https://devs.s3.ap-southeast-1.amazonaws.com/1647926063313.jpg",
}, {
"url": "https://devs.s3.ap-southeast-1.amazonaws.com/1647926063313.jpg",
}],
}
this is my addProduct
export const addProduct = async (productData, shopId, url) => {
const ls = new SecureLS({ encodingType: "aes" });
const token = ls.get("token");
const formdata = new FormData();
// console.log(productData.name);
for (let index = 0; index < productData.images.length; index++) {
formdata.append("file", productData.images[index]);
}
formdata.append("category", productData.category);
formdata.append("name", productData.name);
formdata.append("quantity", productData.quantity);
formdata.append("price", productData.price);
formdata.append("description", productData.description);
formdata.append("ingredients", productData.ingredients);
formdata.append("url", url);
return await fetch(`${API}/product/${shopId}`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
},
body: formdata,
})
.then((response) => {
return response;
})
.catch((err) => {
//console.log(err)
return err;
});
};
Solution 1:[1]
maybe something like this you need to be re debug and check addProduct last parameter :
onSubmit = async (data, { setSubmitting, resetForm }) => {
let filesUrls = [];
for (var i = 0; i < selectedImageFiles.length; i++) {
const urlLink = await generateUploadUrl(selectedImageFiles[i].type);
const to_base64 = (file) =>
new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = (error) => reject(error);
});
let blob = await to_base64(selectedImageFiles[i]);
let binary = atob(blob.split(",")[1]);
let array = [];
for (var x = 0; x < binary.length; x++) {
array.push(binary.charCodeAt(x));
}
let blobData = new Blob([new Uint8Array(array)], {
type: selectedImageFiles[i].type,
});
const uploadImageLink = await uploadImage(urlLink, blobData);
const newUploadImageLink = uploadImageLink.url.split("?")[0];
filesUrls.push(newUploadImageLink);
}
let productData = {
...data,
shopId: userShop._id,
images: filesUrls,
category: collectCategoryId()[0],
};
addProduct(productData, userShop._id).then(
(response) => {
if (response.status === 200) {
response.json().then((result) => {
setSubmitting(false);
});
} else {
response.json().then((result) => {
setSubmitting(false);
});
}
});
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
