Se connecter

Informatique

Programmation

Sujet : [Javascript] Aide projet
1
BaelishlaChance
Niveau 4
13 mai 2024 à 16:23:51

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 :

"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) {
    
  }
}
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);
  }
};
BaelishlaChance
Niveau 4
13 mai 2024 à 16:32:43

Oublié le lien vers le tuto :

https://youtu.be/lh9XVGv6BHs?si=vzjglW85f7kttOjQ&t=6512

LGV
Niveau 24
13 mai 2024 à 16:39:59

Bonjour,

dans le terminal [...] 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à?)

mais poste tout, le code et le tuto, sauf les-dites erreurs...

ce serait utile de partager le retour console, car c'est surement le plus gros indice pour savoir ce qui ne marche pas.

BaelishlaChance
Niveau 4
13 mai 2024 à 16:45:16

Le 13 mai 2024 à 16:39:59 :
Bonjour,

dans le terminal [...] 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à?)

mais poste tout, le code et le tuto, sauf les-dites erreurs...

ce serait utile de partager le retour console, car c'est surement le plus gros indice pour savoir ce qui ne marche pas.

Bien sûr tu as raison, 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
BaelishlaChance
Niveau 4
14 mai 2024 à 10:20:31

up !

bouboulefou8
Niveau 2
14 mai 2024 à 17:11:11

tu dois avoir un problème entre comment ta table est structurée et les données que tu envoie

1
Sujet : [Javascript] Aide projet
News événement
Jouez et tentez de remporter des places de cinéma ainsi que des goodies du film Kraven The Hunter
   Retour haut de page
Consulter la version web de cette page