Topic de BaelishlaChance :

[Javascript] Aide projet

  • 1

Salut les kheys,

Je suis ce tuto pour faire un web scraper amazon. J'en suis rendu à la moitié mais je suis bloqué depuis plus d'une semaine à cause de Mongoose. En effet, aucun des produits scrapé n'est ajouté à la collection de la database, et ce malgré que le scraping soit réussi.

À noter que dans le terminal malgré la réussite du scraping j'ai tout de même un retour d'erreur que je ne réussi pas à faire partir (peut-être que le problème est là?)

Bref j'ai vraiment besoin d'aide :/ je compte sur vous

Mon code :

import mongoose from "mongoose";
import { connectTodb } from "../mongoose";


const productSchema = new mongoose.Schema({
  url: {type : String, required:true, unique:true},
  currency: {type: String, required:true},
  image: {type: String, required:true},
  title: {type: String, required:true},
  currentPrice: {type: Number, required:true},
  originalPrice: {type: Number, required:true},
  priceHistory: [
    {
      prices: {type: Number, required: true},
      date: {type:Date, default: Date.now}
    },
  ],
  lowestPrice: {type: Number},
  highestPrice: {type: Number},
  averagePrice: {type: Number},
  discountRate: {type: Number},
  description: {type: String},
  isOutOfStock: {type: Boolean, default: false},
  users: [{email: {type: String, required: true}}],
}, {timestamps: true});

const Product = mongoose.models.Product || mongoose.model('Product', productSchema);

export default Product;
import mongoose from "mongoose";


let isConnected = false;

export const connectTodb = async () => {
  mongoose.set('strictQuery', true);
  // Vérifie si MONGODB_URI est défini
  if (!process.env.MONGODB_URI) {
    console.error('MONGODB_URI is not defined');
    return;
  }

  if(isConnected) return console.log('=> using existing database connection');
  
  try {
    await mongoose.connect(process.env.MONGODB_URI);
    isConnected = true;
    console.log('MONGODB Connected');
  } catch (error) {
    console.error('Failed to connect to MongoDB:', error);
  }
};
"use server"

import Product from "../models/product.model";
import { connectTodb } from "../mongoose";
import { scrapeAmazonProduct } from "../scraper";
import { getAveragePrice, getHighestPrice, getLowestPrice } from "../util";
import { revalidatePath } from "next/cache";

export async function scrapeAndStoreProduct(productURL: string) {
  if (!productURL) return;

  try {
    connectTodb();
    const scrapedProduct: any = await scrapeAmazonProduct(productURL);
    
    if (!scrapedProduct) {
      console.log("Failed to scrape product");
      return; // Stop execution if product scraping failed
    }
    let product = scrapedProduct;

    // Check if scrapedProduct is an object and has a url property
    if (typeof scrapedProduct === 'object' && scrapedProduct !== null && 'url' in scrapedProduct) {
      const existingProduct = await Product.findOne({ url: scrapedProduct.url });
      if (existingProduct) {
        const updatedPriceHistory : any = [
          ...existingProduct.priceHistory,
          { price: scrapedProduct.currentPrice }
        ]
        product = {
          ...scrapedProduct,
          priceHistory: updatedPriceHistory,
          lowestPrice: getLowestPrice(updatedPriceHistory),
          highestPrice: getHighestPrice(updatedPriceHistory),
          averagePrice: getAveragePrice(updatedPriceHistory)

        }
      }
    }
    const newProduct = await Product.findOneAndUpdate(
      {url: scrapedProduct.url},
      product,
      {upsert: true, new:true}
      );
    revalidatePath(`/products/${newProduct._id}`);
  } catch (error: any) {
    throw new Error(`Failed to create/update product: ${error.message}`)
  }
}


export async function getProductById(productId: string){
  try {
    connectTodb();
  } catch (error) {
    
  }
}

Voici le retour console :

 Compiled / in 3s (864 modules)
Warning: Each child in a list should have a unique "key" prop.

Check the top-level render call using <div>. See https://reactjs.org/link/warning-keys for more information.
    at div
 GET / 200 in 3305ms
 Compiled in 250ms (303 modules)
MONGODB Connected
{
  url: 'https://www.amazon.fr/Acer-Nitro-KG241YS3biipf-BluelightShield-Inclinable/dp/B0C28QPGR2/ref=pd_ci_mcx_mh_mcx_views_0?pd_rd_w=6Um3V&content-id=amzn1.sym.599bf194-df9f-4215-9a04-668b64035e9b%3Aamzn1.symc.45dc5f4c-d617-4dba-aa26-2cadef3da899&pf_rd_p=599bf194-df9f-4215-9a04-668b64035e9b&pf_rd_r=GZT3RR107R9VMD4YD53C&pd_rd_wg=xXitn&pd_rd_r=faaf1dc0-3548-448f-a812-ecb8c374ca29&pd_rd_i=B0C28QPGR2',
  currency: '€',
  image: 'https://m.media-amazon.com/images/I/71GazIpwJ+L._AC_SX355_.jpg',
  title: 'Acer Nitro KG241YS3biipf - Écran PC Gaming 24" Full HD, 180Hz (1920x1080, 16:9, FreeSync, 1ms VRB, 250 Nits, Comfyview, BluelightShield, 2xHDMI 2.0/1xDP 1.2) Moniteur PC Inclinable, Couleur Noir',
  currentPrice: 139139,
  originalPrice: 1449014490429609,
  priceHistory: [],
  discountRate: NaN,
  outOfStock: false,
  description: ''Ecran pc amazon",
  lowestPrice: 139139,
  highestPrice: 139139,
  averagePrice: 139139,
  reviewsCount: 3
}
Failed to scrape product
 POST / 200 in 3188ms
j'ai demandé à chatGPT et ton "Warning: Each child in a list should have a unique "key" propx " c'est pas une erreur mais un avertissement, sous react tu as besoin de donner une clef au élément de la page pour une question de performance mais ducoup pour toi ça n'as pas d'interêt donc ton erreur vient surement de la manière dont tu enregistre tes données dans mongodb

Le 13 mai 2024 à 16:52:57 :
j'ai demandé à chatGPT et ton "Warning: Each child in a list should have a unique "key" propx " c'est pas une erreur mais un avertissement, sous react tu as besoin de donner une clef au élément de la page pour une question de performance mais ducoup pour toi ça n'as pas d'interêt donc ton erreur vient surement de la manière dont tu enregistre tes données dans mongodb

Merci pour ta réponse, oui c'est ce que je pense aussi mais je ne trouve vraiment pas où se situe exactement le problème et quoi changer

Pour résoudre le problème du projet en JavaScript mentionné sur le forum, voici un plan d'action :

Connexion à la base de données : Vérifiez que la connexion à la base de données est correctement établie.
Gestion des erreurs : Ajoutez des messages d'erreur détaillés pour identifier précisément le problème.
Schéma et gestion des données : Assurez-vous que les données sont correctement gérées et enregistrées dans la base de données.
mongoose.js
javascript
Copier le code
import mongoose from "mongoose";

let isConnected = false;

export const connectTodb = async () => {
mongoose.set('strictQuery', true);

if (!process.env.MONGODB_URI) {
console.error('MONGODB_URI n\'est pas défini');
return;
}

if (isConnected) {
console.log('=> Utilisation de la connexion existante à la base de données');
return;
}

try {
await mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });
isConnected = true;
console.log('=> Nouvelle connexion à la base de données établie');
} catch (error) {
console.error('Erreur de connexion à la base de données :', error);
}
};
gestion_erreurs.js
javascript
Copier le code
import { connectTodb } from './mongoose';

const fetchData = async () => {
try {
await connectTodb();
// Votre code de récupération des données
} catch (error) {
console.error('Erreur lors de la récupération des données :', error);
}
};

fetchData();
Débogage
Ajoutez des console.log à différents endroits pour suivre le flux du programme et identifier où il échoue.

Utilisez ce plan pour corriger le code et résoudre les problèmes rencontrés.

Utilise Chat GPT, en lui demandant qu’il t’explique la solution (qu’est-ce ce que sa solution résout exactement).

C’est ultra utile, au lieu de galerer à chercher sur stackoverflow ou autre

J'ai utilisé chatGPT intensivement depuis une semaine, repris la partie du code ligne par ligne en suivant le tuto mais rien à y faire :/

Le 14 mai 2024 à 19:58:39 :
Pour résoudre le problème du projet en JavaScript mentionné sur le forum, voici un plan d'action :

Connexion à la base de données : Vérifiez que la connexion à la base de données est correctement établie.
Gestion des erreurs : Ajoutez des messages d'erreur détaillés pour identifier précisément le problème.
Schéma et gestion des données : Assurez-vous que les données sont correctement gérées et enregistrées dans la base de données.
mongoose.js
javascript
Copier le code
import mongoose from "mongoose";

let isConnected = false;

export const connectTodb = async () => {
mongoose.set('strictQuery', true);

if (!process.env.MONGODB_URI) {
console.error('MONGODB_URI n\'est pas défini');
return;
}

if (isConnected) {
console.log('=> Utilisation de la connexion existante à la base de données');
return;
}

try {
await mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true });
isConnected = true;
console.log('=> Nouvelle connexion à la base de données établie');
} catch (error) {
console.error('Erreur de connexion à la base de données :', error);
}
};
gestion_erreurs.js
javascript
Copier le code
import { connectTodb } from './mongoose';

const fetchData = async () => {
try {
await connectTodb();
// Votre code de récupération des données
} catch (error) {
console.error('Erreur lors de la récupération des données :', error);
}
};

fetchData();
Débogage
Ajoutez des console.log à différents endroits pour suivre le flux du programme et identifier où il échoue.

Utilisez ce plan pour corriger le code et résoudre les problèmes rencontrés.

La connection est établie sûr

Je revoie le schéma de gestion des données, mais j'ai simplement suivi ce que le tuto donnait et ça devrait être un formatage classique pour tout Amazon

Je reprécise que le scraping a bien lieu, c'est les produit qui ne sont pas ajoutés à mongoose

T’utilise des Schema pour créer et remplir tes collections dans MongoDB?

Le 14 mai 2024 à 20:08:14 :
T’utilise des Schema pour créer et remplir tes collections dans MongoDB?

Oui, voilà le code

import mongoose from "mongoose";
import { connectTodb } from "../mongoose";


const productSchema = new mongoose.Schema({
  url: {type : String, required:true, unique:true},
  currency: {type: String, required:true},
  image: {type: String, required:true},
  title: {type: String, required:true},
  currentPrice: {type: Number, required:true},
  originalPrice: {type: Number, required:true},
  priceHistory: [
    {
      prices: {type: Number, required: true},
      date: {type:Date, default: Date.now}
    },
  ],
  lowestPrice: {type: Number},
  highestPrice: {type: Number},
  averagePrice: {type: Number},
  discountRate: {type: Number},
  description: {type: String},
  isOutOfStock: {type: Boolean, default: false},
  users: [{email: {type: String, required: true}}],
}, {timestamps: true});

const Product = mongoose.models.Product || mongoose.model('Product', productSchema);

export default Product;

Je pense que le problème vient du fait que malgré un scraping réussi j'ai tout de même un retour d'erreur dans ma console :

    '    Meilleures évaluations',
  lowestPrice: 139139,
  highestPrice: 139139,
  averagePrice: 139139,
  reviewsCount: 3
}
Failed to scrape product
  • 1

Données du topic

Auteur
BaelishlaChance
Date de création
13 mai 2024 à 16:20:11
Nb. messages archivés
15
Nb. messages JVC
15
En ligne sur JvArchive 132