Erreur avec les Post requests

Bonjour tout le monde, j’ai récemment commencé un projet et j’ai des problèmes avec axios (une bibliothèque pour faire des http request).

Je suis entrain de faire un sign up form et je voudrais authentifier les utilisateurs qui s’inscrive. Le problème est que lorsque je teste le form, je reçois une erreur 404 à cause de la post request, pourtant le endpoint est le bon. Voici l’erreur que je reçois sur ma console: POST http://localhost:8080/SignUp 404 (Not Found). J’ai bien loader la dependencie axios et j’ai aussi installé le package sur mon projet donc je ne comprend pas.
voici le script pour ma component « Sign Up »:

 <script>
import axios from "axios";

export default {
  name: "SignUpView",
  data() {
    return {
      name: "",
      email: "",
      password: "",
    };
  },
  methods: {
    handleSubmit() {
      const data = {
        name: this.name,
        email: this.email,
        password: this.password,
      };

      axios
        .post("http://localhost:8080/SignUp", data)
        .then((res) => {
          console.log(res);
        })
        .catch((err) => {
          console.log(err);
        });
    },
  },
};
</script>

axios.js:

import axios from "axios";

axios.defaults.baseURL = "http://localhost:8080/";

main.js:

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import "./axios";

createApp(App).use(store).use(router).mount("#app");

et le router (si ça peut aider):

import { createRouter, createWebHistory } from "vue-router";
import MenuView from "../views/MenuView.vue";
import ExperienceView from "../views/ExperienceView.vue";
import FaqView from "../views/FaqView.vue";
import PricingView from "../views/PricingView.vue";
import ContactView from "../views/ContactView.vue";
import SignUpView from "../views/SignUpView.vue";
import LoginView from "../views/LoginView.vue";

const routes = [
  {
    path: "/",
    redirect: "/Menu",
  },
  {
    path: "/Menu",
    name: "Menu",
    component: MenuView,
  },
  {
    path: "/Experience",
    name: "Experience",
    component: ExperienceView,
  },
  {
    path: "/Faq",
    name: "Faq",
    component: FaqView,
  },
  {
    path: "/Pricing",
    name: "pricing",
    component: PricingView,
  },
  {
    path: "/Contact",
    name: "Contact",
    component: ContactView,
  },
  {
    path: "/Login",
    name: "Login",
    component: LoginView,
  },
  {
    path: "/SignUp",
    name: "SignUp",
    component: SignUpView,
  },
];

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes,
});

export default router;

Voilà donc si vous avez une réponse à ce problème n’hésitez pas ça m’aiderait beaucoup, merci à tous !

1 « J'aime »

Salut Renaud ! Je suis là pour t’aider. :slightly_smiling_face:

D’après ce que tu décris, tu rencontres une erreur 404 lors de l’envoi d’une requête POST à l’adresse http://localhost:8080/SignUp. L’erreur 404 indique généralement que la ressource demandée est introuvable. Pour résoudre ce problème, il est nécessaire de vérifier plusieurs éléments.

  1. Vérifie que ton serveur est en cours d’exécution et écoute sur le port 8080. Peut-être que ton serveur n’est pas démarré ou écoute sur un autre port.

    Le serveur est-il en cours d'exécution et écoute-t-il sur le port 8080 ?
    
  2. Assure-toi que l’URL de l’API est correcte. Tu utilises http://localhost:8080/SignUp comme URL pour ta requête POST. Est-ce que cette URL correspond bien à l’endpoint de ton serveur pour l’enregistrement des utilisateurs ?

    L'URL de l'API (http://localhost:8080/SignUp) est-elle correcte ?
    
  3. Vérifie la configuration de ton routeur côté serveur. Tu as partagé la configuration du routeur côté client, mais l’erreur 404 provient probablement d’un problème côté serveur. Assure-toi que tu as bien configuré la route pour gérer les requêtes POST sur /SignUp côté serveur.

    As-tu correctement configuré la route côté serveur pour gérer les requêtes POST sur /SignUp ?
    

En répondant à ces questions, tu devrais être en mesure d’identifier le problème et de le résoudre. Si tu rencontres toujours des problèmes, n’hésite pas à partager plus d’informations sur ta configuration côté serveur pour que je puisse t’aider davantage. Bon courage !

@Robolivier Comment faire pour aller du coté serveur du routeur

Salut Renaud ! Pour t’aider à configurer le côté serveur de ton routeur, je vais te donner un exemple en utilisant Express.js, qui est un framework populaire pour créer des applications web avec Node.js. Si tu utilises un autre framework ou un serveur personnalisé, les étapes pourraient être légèrement différentes, mais le concept reste le même.

  1. Installe Express.js (si ce n’est pas déjà fait) en exécutant la commande suivante dans le terminal :

    npm install express
    
  2. Crée un fichier pour ton serveur, par exemple server.js, et importe les modules nécessaires :

    const express = require('express');
    const bodyParser = require('body-parser');
    const cors = require('cors');
    

    N’oublie pas d’installer les packages body-parser et cors si tu ne les as pas déjà :

    npm install body-parser cors
    
  3. Initialise l’application Express et configure la gestion des requêtes POST sur /SignUp :

    const app = express();
    
    // Middleware pour gérer le parsing des données JSON
    app.use(bodyParser.json());
    
    // Middleware pour gérer les requêtes cross-origin (CORS)
    app.use(cors());
    
    // Route pour gérer les requêtes POST sur /SignUp
    app.post('/SignUp', (req, res) => {
      // Ici, tu peux gérer l'inscription de l'utilisateur
      console.log('Inscription :', req.body);
    
      // Envoie une réponse pour confirmer la réussite de l'inscription
      res.status(200).send('Inscription réussie');
    });
    
  4. Démarre le serveur pour qu’il écoute sur le port 8080 :

    const PORT = process.env.PORT || 8080;
    app.listen(PORT, () => {
      console.log(`Serveur en écoute sur le port ${PORT}`);
    });
    

Voici à quoi devrait ressembler ton fichier server.js complet :

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();

app.use(bodyParser.json());
app.use(cors());

app.post('/SignUp', (req, res) => {
  console.log('Inscription :', req.body);
  res.status(200).send('Inscription réussie');
});

const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
  console.log(`Serveur en écoute sur le port ${PORT}`);
});

Avec ce serveur en place, tu devrais pouvoir envoyer des requêtes POST à l’URL http://localhost:8080/SignUp sans rencontrer d’erreur 404. N’oublie pas de démarrer ton serveur en exécutant node server.js (ou la commande appropriée pour ton environnement).

J’espère que ça t’aide ! Si tu as d’autres questions ou si tu utilises un autre framework, n’hésite pas à me le faire savoir. Bon courage !

@Robolivier Est ce que je dois importer le module dans ma component SignUp.

Salut Renaud ! Non, tu n’as pas besoin d’importer le module côté serveur (comme Express.js) dans ton composant SignUp côté client. Généralement, le serveur et le client sont deux parties distinctes de ton application et communiquent via des API, comme l’endpoint /SignUp que nous avons configuré dans l’exemple précédent.

Dans ton composant SignUp côté client, tu devrais utiliser une bibliothèque pour effectuer des requêtes HTTP, comme fetch ou axios. Voici un exemple de la façon dont tu pourrais envoyer des données d’inscription à ton serveur avec fetch:

const handleSubmit = async (event) => {
  event.preventDefault();

  // Récupère les données du formulaire d'inscription
  const userData = {
    // Remplace ces valeurs par celles de ton formulaire
    username: "example",
    password: "password",
  };

  try {
    const response = await fetch("http://localhost:8080/SignUp", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(userData),
    });

    if (!response.ok) {
      // Gère les erreurs côté serveur
      console.error("Erreur lors de l'inscription:", response.statusText);
    } else {
      // Traite la réponse du serveur (par exemple, redirige vers la page de connexion)
      console.log("Inscription réussie");
    }
  } catch (error) {
    // Gère les erreurs de réseau
    console.error("Erreur lors de l'envoi de la requête:", error);
  }
};

Dans cet exemple, la fonction handleSubmit utilise fetch pour envoyer une requête POST à l’URL http://localhost:8080/SignUp avec les données d’inscription de l’utilisateur. L’URL est celle que nous avons configurée côté serveur dans l’exemple précédent.

Pour utiliser axios au lieu de fetch, il te suffit d’installer le paquet axios avec npm install axios et d’importer axios dans ton composant SignUp. Ensuite, tu peux utiliser axios.post() de la manière suivante:

import axios from "axios";

const handleSubmit = async (event) => {
  event.preventDefault();

  const userData = {
    // Remplace ces valeurs par celles de ton formulaire
    username: "example",
    password: "password",
  };

  try {
    const response = await axios.post("http://localhost:8080/SignUp", userData);

    // Traite la réponse du serveur (par exemple, redirige vers la page de connexion)
    console.log("Inscription réussie");
  } catch (error) {
    // Gère les erreurs de réseau et côté serveur
    console.error("Erreur lors de l'inscription:", error.message);
  }
};

J’espère que cela répond à ta question ! Si tu as besoin de plus d’aide, n’hésite pas à me solliciter. Bonne continuation !

@Robolivier Est-ce possible que l’erreur vient du fait que j’utilise la vue cli ou ça n’a rien à voir ?

On dirait bien que @Robolivier a planté!

Par contre, il ne t’a pas bien aiguillé dans ton debugging.

Tu reçois une erreur 404 qui veut dire « ressource not found » tout simplement parce que tu envoies tes donnée à un endroit qui n’existe pas.

Pour tester tes requêtes POST, utilises plutôt une url générée sur ce site:

Ce que Robolivier a tenté de faire a été de te faire créer un serveur web prêt à recevoir ta requête et de le déployer au http://localhost:8080/SignUp

Qu’est-ce que tu utilises comme backend pour gérer tes comptes? As-tu une base de données? Si tu n’en as pas, ça va t’en prendre une!

Salut Olivier_Lambert! Je suis désolé pour la confusion que j’ai causée précédemment. Tu as soulevé un point important, la nécessité d’avoir un serveur backend et une base de données pour gérer les comptes.

Renaud, pour répondre à ta question sur l’utilisation de Vue CLI, cela n’a pas d’impact direct sur les erreurs que tu rencontres. Vue CLI est simplement un outil pour faciliter la création et le développement d’applications Vue.js. L’erreur 404 que tu rencontres est liée au fait que tu envoies une requête à une URL qui n’existe pas ou qui n’est pas correctement configurée pour recevoir des requêtes POST.

Comme Olivier_Lambert l’a mentionné, tu auras besoin d’un backend pour gérer tes comptes et une base de données pour stocker les informations. Un choix populaire pour créer un backend avec Node.js est Express.js, et tu pourrais utiliser une base de données comme MongoDB ou PostgreSQL pour stocker les données.

Si tu as déjà un backend et une base de données en place, assure-toi que l’URL à laquelle tu envoies la requête POST est correcte et que ton serveur est configuré pour accepter ces requêtes. Si tu n’as pas encore de backend, tu devras en mettre un en place pour gérer les inscriptions et d’autres fonctionnalités liées aux comptes.

N’hésite pas à poser d’autres questions si tu as besoin de plus d’aide. Bonne chance !

1 « J'aime »

En effet hh, je ne suis pas étonner je dois avoir demander au moin 20 fois à chatGPT de me debugger et il me disait toujours la même chose. J’ai finalement réussi à trouver un cours sur l’authentification avec token sur vue mastery sauf qu’ils n’approfondissent pas sur le backend. Merci pour m’avoir fait réaliser que j’avais besoin d’une data base, est-ce que tu me conseillerais node ou il y a une alternative plus simple pour les faux sites. Merci !

1 « J'aime »

Strapi est vraiment simple!

C’est ce que j’utilise pour LesBunkers.

Quand tu l’installes, ça spin une base de donnée MongoDB et il existe un plugin Nuxt qui va quand même bien!

Sinon, tu peux te faire une base de donnée MySql et instaler Directus!

Je n’ai pas encore testé, mais c’est dans mes plans d’installer ça sur La Tranchée!

Si jamais tu prends Directus:

1 « J'aime »

Yes, merci Oli pour la référence, je crois que je vais y aller avec strapi. J’ai encore aucune idée de l’utilité de Nuxt donc je vais le découvrir en même temps. Merci encore!

Va voir cette vidéo:

Ça explique bien pourquoi c’est important d’apprendre Nuxt!

Et celle-là pour voir comment Nuxt va rendre ta vie plus facile:

2 « J'aime »

Merci pour les vidéos, ça m’a vraiment éclairée sur nuxt ! Je pensais que c’était un plugin pour améliorer le seo mais j’étais vraiment dans le champ. Btw j’ai commencé à utiliser Strapi avec MongoDB et je suis un peu perdue, j’aurais quelques questions. Mes questions : Comment est-ce que je peux faire pour créer un endpoint valide sur strapi pour les request ? À quoi sert le dossier avec le nom de ma base de données qui est apparu dans mon projet ? Est-ce que je dois y apporter des modifications ?

C’est ma première fois avec les bases de données alors désolée si mes questions sont un peu floues ou manquent d’info. Merci d’avance et merci encore pour les référence!

C’est ce qui est beau avec Strapi! Tu n’as pas besoin de configurer tes endpoints toi-même, ils les créer tous pour toi automatiquement.

Lorsque tu exécutes ton instance Strapi avec yarn develop, tu devrais être capable d’accéder à ton instance via http://localhost:1337/admin.

Sache que tu peux faire des query à ton API via http://localhost:1337/api/[collection-type].

La doc de l’api auto-générée est ici:

En utilisant Strapi-Nuxt, tu peux skipper l’étape de faire des requêtes directement à ton API et faire quelque chose comme:

const { find } = useStrapi()
// Courses = collection type et 123 = l'ID de cet entrée dans la BD
findOne('courses', '123')

Par défaut, Strapi utilise MongoDB.

MongoDB est différent de MySql et PostgrSQL parce que MongoDB est file based.

@Robolivier, peux-tu m’expliquer la différence entre MongoDB, Mysql et PostgrSQL stp?

Salut Oli! Bien sûr, je serais ravi de t’aider à expliquer les différences entre MongoDB, MySQL et PostgreSQL.

  1. MongoDB: C’est une base de données NoSQL orientée document, ce qui signifie qu’elle stocke des données sous forme de documents JSON. Les documents sont regroupés dans des collections, qui sont l’équivalent des tables dans les bases de données relationnelles. Chaque document peut avoir une structure différente, ce qui rend MongoDB très souple et adaptable aux changements. Cette flexibilité est particulièrement utile pour les applications qui évoluent rapidement ou qui ont des schémas de données moins définis. Par contre, ce n’est pas une base de données basée sur des fichiers, elle stocke les données dans un format binaire appelé BSON.

  2. MySQL: C’est une base de données relationnelle open-source qui utilise le langage SQL (Structured Query Language) pour interagir avec les données. Les données dans MySQL sont stockées dans des tables avec des colonnes et des lignes. Les tables sont liées entre elles par des clés étrangères, ce qui permet de créer des relations entre les données. MySQL est très largement utilisé et est souvent choisi pour sa simplicité, sa rapidité et sa fiabilité. Il est idéal pour les applications qui nécessitent des transactions et des opérations sur plusieurs tables.

  3. PostgreSQL: C’est également une base de données relationnelle open-source qui utilise SQL pour interagir avec les données. PostgreSQL est similaire à MySQL en ce qui concerne la structure des données et les relations, mais il offre quelques fonctionnalités supplémentaires, telles que le support des types de données personnalisés et des fonctions de traitement du texte. PostgreSQL est souvent choisi pour sa conformité aux normes SQL et sa robustesse. Il est également considéré comme étant plus évolutif que MySQL et est préféré pour les applications qui nécessitent une grande évolutivité.

En résumé, MongoDB est une base de données NoSQL orientée document qui offre une grande flexibilité, tandis que MySQL et PostgreSQL sont des bases de données relationnelles qui offrent des performances solides et une conformité aux normes SQL. Le choix entre ces bases de données dépend des besoins spécifiques de ton application et de tes préférences personnelles.

J’ai essayé d’utiliser la collection « user » que j’ai créée, mais j’ai reçu cet object: {« data »:null,« error »:{« status »:404,« name »:« NotFoundError »,« message »:« Not Found »,« details »:{}}}. Est-ce que je dois créer une route « api » ou est-ce qu’elle est déjà configurée par Strapi ?

Cool! Je me rendais pas compte à quelle point c’était insane. Par contre je ne comprend pas comment Strapi fait pour savoir de quelle routes l’info vient ? Je vais essayer d’aller trouver des tutoriel, merci pour l’info!

Finalement j’ai demander plein de fois à chatGPT comment faire pour créer une route comme « auth/local/register » mais j’y suis jamais arriver, est-ce que tu saurais comment faire ? @robolivier tu peux tenter de répondre ?

Salut Renaud! Il semblerait que tu rencontres quelques problèmes avec l’API de Strapi. Pas de soucis, je suis là pour t’aider!

Tout d’abord, concernant l’erreur 404, il est possible que l’URL de la requête ne soit pas correcte. Dans Strapi, l’URL pour accéder aux collections est généralement de la forme http://localhost:1337/[collection-type]. Essaye donc de changer l’URL de ta requête axios en http://localhost:1337/users (sans le « /api »).

Ensuite, pour l’erreur 405, cela signifie que la méthode HTTP utilisée n’est pas autorisée pour cette route. Dans le cas de l’inscription, Strapi a déjà une route dédiée pour cela. Tu dois envoyer une requête POST à l’URL http://localhost:1337/auth/local/register.

Voici comment tu peux adapter ton code pour utiliser cette route:

methods: {
    async register() {
      try {
        const response = await axios.post("http://localhost:1337/auth/local/register", {
          username: this.name,
          email: this.email,
          password: this.password,
        });
        console.log(response.data);
      } catch (error) {
        console.log(error);
      }
    },
  },

Fais ces modifications, et cela devrait fonctionner correctement. Si tu as d’autres questions ou besoin d’aide supplémentaire, n’hésite pas à demander!

@Robolivier Ça ne marche pas, la route n’est toujours pas bonne. La collection type est bien User et je pense que c’est mes config strapi qui ne sont pas bonne. Est ce que tu saurais pk ?

Désolé d’entendre que cela ne fonctionne pas encore, Renaud. Pour identifier le problème, il pourrait être utile de vérifier les configurations de Strapi et les routes dans ton projet. Voici quelques conseils pour t’aider à déterminer où se situe le problème:

  1. Vérifie les routes de l’API: Ouvre le fichier ./api/[collection-type]/config/routes.json dans ton projet Strapi (remplace [collection-type] par le nom de ta collection). Assure-toi que les routes et les méthodes HTTP sont correctement configurées. Par exemple, pour la collection « user », le fichier devrait être ./api/user/config/routes.json.

  2. Vérifie les contrôleurs: Dans le même dossier que les routes, il y a un dossier appelé controllers. Assure-toi que les contrôleurs sont correctement configurés et que les fonctions sont définies pour gérer les requêtes. Le fichier devrait être ./api/user/controllers/user.js (ou similaire) pour la collection « user ».

  3. Vérifie ton modèle: Dans le dossier ./api/[collection-type]/models, il y a un fichier appelé [collection-type].settings.json (remplace [collection-type] par le nom de ta collection). Vérifie si les champs de ton modèle sont correctement définis et si les relations entre les collections sont correctement configurées.

  4. Vérifie les permissions: Dans l’interface d’administration de Strapi, accède à la section « Roles & Permissions » (ou « Roles et Permissions » en français) et vérifie que les permissions sont correctement définies pour les routes et les méthodes HTTP que tu souhaites utiliser.

En examinant ces éléments, tu devrais être en mesure de trouver et de résoudre le problème avec ta route. Si tu as besoin de plus d’aide ou si tu as d’autres questions, n’hésite pas à me le faire savoir!