Erreur

Formulaire de Contact Node.js

Le problème exposé dans ce sujet a été résolu.

J’ai extend une seule fois. Comment ça se fait qu’il est lancé plusieurs fois ?

Awoken

Parce que tu accèdes plusieurs fois à la route /contact.

Jérôme Deuchnord

app.post(’/contact’, function(req, res, next){ res.send(’test’); });

Je le fais qu’une seule fois non ?

EDIT : Je devrais utiliser DEL ?

+0 -0

Mais tu comprends le concept de route et de contrôleur, Awoken ? Tu comprends ce que tu fais ou tu fais au hasard ?

Tu as une application Express. C’est comme une cuisine. T’as une route /contact. C’est un tiroir dans ta cuisine.

Maintenant tu veux installer un frigo dans ta cuisine. Est-ce que tu l’installes dans la cuisine, ou est-ce que tu t’arranges pour qu’un frigo s’installe chaque fois que tu ouvres le tiroir ? Puis quand tu as ouvert 3x ton tiroir tu appelles Ikea pour te plaindre qu’il y a une génération spontanée de frigos dans ta cuisine, qui n’est plus fonctionnelle du fait qu’elle est très encombrée par tant de satanés frigos ?

+5 -0

Mais tu comprends le concept de route et de contrôleur, Awoken ? Tu comprends ce que tu fais ou tu fais au hasard ?

Tu as une application Express. C’est comme une cuisine. T’as une route /contact. C’est un tiroir dans ta cuisine.

Maintenant tu veux installer un frigo dans ta cuisine. Est-ce que tu l’installes dans la cuisine, ou est-ce que tu t’arranges pour qu’un frigo s’installe chaque fois que tu ouvres le tiroir ? Puis quand tu as ouvert 3x ton tiroir tu appelles Ikea pour te plaindre qu’il y a une génération spontanée de frigos dans ta cuisine, qui n’est plus fonctionnelle du fait qu’elle est très encombrée par tant de satanés frigos ?

victor

Pourquoi au bout de 3x, il y a une génération spontanée de frigos ?

Ta ligne app.post('/contact', function(req, res, next){...} dit, si je ne me trompe pas, "execute ’…’ à chaque fois que le client fait un POST à l’adresse /contact. Du coup à chaque fois que tu envois ton formulaire, cette fonction est exécuté et donc à chaque fois tu fais le extend.

Ta ligne app.post('/contact', function(req, res, next){...} dit, si je ne me trompe pas, "execute ’…’ à chaque fois que le client fait un POST à l’adresse /contact. Du coup à chaque fois que tu envois ton formulaire, cette fonction est exécuté et donc à chaque fois tu fais le extend.

Kje

C’est pas le but ? Ou bien j’ai mal compris ton explication.

Je suis un peu embrouillé, je dois vous l’avouez

Si, c’est tout à fait le but, car c’est ce qui permet de générer ta page.

Mais ici, tu cherches à paramétrer une bibliothèque. Comme tu n’as pas besoin de le faire plusieurs fois, tu n’as pas besoin de le mettre dans une route, car ça alourdit le traitement inutilement (d’ailleurs, ici il refuse tout simplement de refaire la configuration) :)

+0 -0

Si, c’est tout à fait le but, car c’est ce qui permet de générer ta page.

Mais ici, tu cherches à paramétrer une bibliothèque. Comme tu n’as pas besoin de le faire plusieurs fois, tu n’as pas besoin de le mettre dans une route, car ça alourdit le traitement inutilement (d’ailleurs, ici il refuse tout simplement de refaire la configuration) :)

Jérôme Deuchnord

Je suis pas obligé de faire le

1
2
3
app.post('/contact', function(req, res, next){
    res.send('test');
  }); 

Là, tu génères une page (qui en l’occurrence contient simplement test). Tu as donc besoin de définir une route.

Si tu as déjà fait du PHP et du MVC, tu peux voir le code à l’intérieur de la route comme le contrôleur de ta page et le code en dehors de la route comme ce qui est fait par le serveur Web (Apache, Nginx… peu importe lequel) pour mettre à disposition les services qui lui sont propres.

La limite de mon exemple étant qu’ici, tu ne fais pas seulement un serveur Web :-°

+0 -0

Pourquoi au bout de 3x, il y a une génération spontanée de frigos ?

Awoken

Tu as programmé le tiroir pour que chaque fois que tu ouvres le tiroir, un frigo s’installe dans ta cuisine.

Conséquence de ceci : chaque fois que tu ouvres le tiroir, un frigo s’installe dans ta cuisine.

+2 -0

Awoken, tu es d’accord que tout ce qu’il y a dans la fonction, quand tu fais :

1
2
3
app.post('/contact', function(req, res, next){
    // ...
});

est exécuté à chaque fois que l’utilisateur envoi des données avec le formulaire ?

Ensuite, tu es d’accord que, ta ligne 22 :

1
2
3
mailer.extend(app, {
   // ...
   });

est une fonction de configuration du module d’envoi le mail puisque tu lui donne les infos sur le serveur ?

Le soucis est qu’une configuration doit être faite une seule fois ! Là cela revient à dire "à chaque fois que quelqu’un appel la page, reconfigure le module de mail. Mais tu l’a probablement déjà fait !


Si je me souviens bien, Awoken, avant tu as fais du PHP, non ? Si oui je commence à comprendre ton problème :

  • En Php, dès qu’on appel une page, l’application est démarrée, exécutée et tué à la fin. Dans un tel cas, oui tu dois tout reconfigurer à chaque fois.
  • Avec node/express ce n’est pas le cas ! Quand ton programme est exécuté il reste en mémoire ! Il n’est jamais relancé. L’application est en mémoire et les callback sont exécutés quand les routes sont atteintes.

Comprends-tu la différence ?

Awoken, tu es d’accord que tout ce qu’il y a dans la fonction, quand tu fais :

1
2
3
app.post('/contact', function(req, res, next){
    // ...
});

est exécuté à chaque fois que l’utilisateur envoi des données avec le formulaire ?

Ensuite, tu es d’accord que, ta ligne 22 :

1
2
3
mailer.extend(app, {
   // ...
   });

est une fonction de configuration du module d’envoi le mail puisque tu lui donne les infos sur le serveur ?

Le soucis est qu’une configuration doit être faite une seule fois ! Là cela revient à dire "à chaque fois que quelqu’un appel la page, reconfigure le module de mail. Mais tu l’a probablement déjà fait !


Si je me souviens bien, Awoken, avant tu as fais du PHP, non ? Si oui je commence à comprendre ton problème :

  • En Php, dès qu’on appel une page, l’application est démarrée, exécutée et tué à la fin. Dans un tel cas, oui tu dois tout reconfigurer à chaque fois.
  • Avec node/express ce n’est pas le cas ! Quand ton programme est exécuté il reste en mémoire ! Il n’est jamais relancé. L’application est en mémoire et les callback sont exécutés quand les routes sont atteintes.

Comprends-tu la différence ?

Kje

Je commence à mieux comprendre. Et le PHP, j’en ai fait vite fait (les bases.

EDIT : Si j’ai bien compris, le mailer.extend est de trop, mais ses paramètres je dois les mettre où ? Je crois pas que je suis obligé de les mettre vu que je suis pas chez free

+0 -0

EDIT : Si j’ai bien compris, le mailer.extend est de trop, mais ses paramètres je dois les mettre où ? Je crois pas que je suis obligé de les mettres vu que je suis pas chez free

Awoken

Pas dans le contrôleur d’une route.

+0 -0

C’est obligatoire de les mettres ? Je suis pas chez free

Que tu sois chez free ou non ne change rien. Tu dois déplacer le extend en dehors de la route : juste au dessus par exemple. Et pour le contenu, utilise le smtp de gmail directement.

C’est obligatoire de les mettres ? Je suis pas chez free

Que tu sois chez free ou non ne change rien. Tu dois déplacer le extend en dehors de la route : juste au dessus par exemple. Et pour le contenu, utilise le smtp de gmail directement.

Kje

Ouais mais si je fais ça, c’est pas un ordre logique, si ? :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
const express = require('express'),
swig = require('swig'),
mailer = require('express-mailer'),
path = require('path'),
app = express();

  mailer.extend(app, {
  secureConnection: false,
  transportMethod: 'SMTP',
  auth: {
    user: 'monemail@gmail.com',
    pass: 'monmdp'
  }
});

app.use(express.logger());
app.use(express.bodyParser());
app.use(express.static(path.join(__dirname, 'public')));
app.engine('html', swig.renderFile);


app.set('views', __dirname+'/views');
app.set('view engine', 'html');

app.get('/', function(req, res){
  res.render('index');
});


app.post('/contact', function(req, res, next){
    res.send('test');
  }); 

  app.mailer.send('email', {
    to: 'ton@email.com',
    from: req.body.email,
    subject: req.body.subject,
    message: req.body.message
  }, function(err){
    if(err){
      console.log('On a une erreur!');return;
    }
    res.send('Email envoyé');
  });

app.listen(3000);
console.log('App is running');

Question : Si je met le smtp de gmail, seuls les comptes gmails pourront se connecter ?

+0 -0

EDIT : Si j’ai bien compris, le mailer.extend est de trop, mais ses paramètres je dois les mettre où ? Je crois pas que je suis obligé de les mettres vu que je suis pas chez free

Awoken

Pas dans le contrôleur d’une route.

victor

C’est obligatoire de les mettres ? Je suis pas chez free

Awoken

C’est pas obligatoire de mettre les mêmes paramètres que celui de ta vidéo (vu que tu n’as fais qu’un copier-coller). Mais si je me base sur la vidéo et le code que tu as fourni, c’est bien au bon endroit vu que la clé from de ton mailer (ligne 23 de ton code) correspond à l’email saisi depuis le formulaire. Ensuite le code de ta ligne 32 à la ligne 35 ne sont pas au bon endroit, elles doivent être dans le mailer.extend

Mais maintenant, si tu dois faire sortir cette configuration de ton controlleur tu ne dois pas te baser sur l’email saisi par l’utilisateur en question, mais sur des paramètres que tu maitrise déjà. Il y a un exemple valide sur la page du package concernant la configuration pour gmail.

A partir de là, tu auras moins de problème pour la suite de ton code.

Edit: Oops, tu as déjà modifié ta configuration donc mon post est quelque peu inutile.

Question : Si je met le smtp de gmail, seuls les comptes gmails pourront se connecter ?

Non, pas du tout. Le fait est que c’est de ton compte que seront envoyé les mails vers le second email (qui peut-être le même que le premier).

Edit 2: Mais quand je regarde mieux ton code, ton mail ne sera jamais envoyé que ce soit avec les bons ou mauvais paramètres. L’envoi du mail doit se faire depuis l’interieur de la fonction app.post("/contact", ...)

+0 -0

Je devrais donc mettre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
app.mailer.send('email', {
    to: 'awoken(cfaux)@email.com',
    from: req.body.email,
    subject: req.body.subject,
    message: req.body.message
  }, function(err){
    if(err){
      console.log('On a une erreur!');return;
    }
    res.send('Email envoyé');
  });

dans :

1
2
3
app.post('/contact', function(req, res, next){

  }); 

Je devrais donc mettre :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
app.mailer.send('email', {
    to: 'awoken(cfaux)@email.com',
    from: req.body.email,
    subject: req.body.subject,
    message: req.body.message
  }, function(err){
    if(err){
      console.log('On a une erreur!');return;
    }
    res.send('Email envoyé');
  });

dans :

1
2
3
app.post('/contact', function(req, res, next){

  }); 
Awoken

C’est bien ça. Faut maintenant faire des tests de ton côté pour voir

+0 -0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
C:\Users\didi\Desktop\contact>node app.js
connect.multipart() will be removed in connect 3.0
visit https://github.com/senchalabs/connect/wiki/Connect-3.0 for alternatives
connect.limit() will be removed in connect 3.0
App is running

TypeError: Cannot create property 'reconnectCount' on boolean 'false'
    at SMTPClient._actionAUTHComplete (C:\Users\didi\Desktop\contact\node_modules\express-mailer\node_modules\nodemaile
r\node_modules\simplesmtp\lib\client.js:873:34)
    at SMTPClient._onData (C:\Users\didi\Desktop\contact\node_modules\express-mailer\node_modules\nodemailer\node_modul
es\simplesmtp\lib\client.js:343:29)
    at emitOne (events.js:115:13)
    at TLSSocket.emit (events.js:210:7)
    at addChunk (_stream_readable.js:252:12)
    at readableAddChunk (_stream_readable.js:239:11)
    at TLSSocket.Readable.push (_stream_readable.js:197:10)
    at TLSWrap.onread (net.js:589:20)
:1 - - [Thu, 27 Jul 2017 17:03:07 GMT] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKi t/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" ::1 - - [Thu, 27 Jul 2017 17:03:07 GMT] "GET /css/bootstrap.css HTTP/1.1" 304 - "http://localhost:3000/" "Mozilla/5.0 ( Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" ::1 - - [Thu, 27 Jul 2017 17:03:07 GMT] "GET /favicon.ico HTTP/1.1" 404 - "http://localhost:3000/" "Mozilla/5.0 (Window s NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36" C:\Users\didi\Desktop\contact\node_modules\express-mailer\node_modules\nodemailer\node_modules\simplesmtp\lib\client.js :873 this._xoauth2.reconnectCount = 0; ^

EDIT : J’arrive pas à mettre toute l’erreur dans les ```, désolé !

+0 -0

A en juger, le problème viendrait de connect, je me demande bien pourquoi tu en as besoin. Et je suis d’autant plus surpris que tu n’es pas eu ce problème avant avec logger et body-parser. Car depuis express et ces middlewares sont des packages séparés, à moins que je ne dise des bêtises.

Fais déjà voir ton code actuel

+0 -0

A en juger, le problème viendrait de connect, je me demande bien pourquoi tu en as besoin. Et je suis d’autant plus surpris que tu n’es pas eu ce problème avant avec logger et body-parser. Car depuis express et ces middlewares sont des packages séparés, à moins que je ne dise des bêtises.

Fais déjà voir ton code actuel

azeupaul
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
const express = require('express'),
swig = require('swig'),
mailer = require('express-mailer'),
path = require('path'),
app = express();

  mailer.extend(app, {
  secureConnection: false,
  transportMethod: 'SMTP',
  auth: {
    user: 'monemail@gmail.com',
    pass: 'monmdp'
  }
});

app.use(express.logger());
app.use(express.bodyParser());
app.use(express.static(path.join(__dirname, 'public')));
app.engine('html', swig.renderFile);


app.set('views', __dirname+'/views');
app.set('view engine', 'html');

app.get('/', function(req, res){
  res.render('index');
});


app.post('/contact', function(req, res, next){

    app.mailer.send('email', {
    to: 'awoken(cfaux)@email.com',
    from: req.body.email,
    subject: req.body.subject,
    message: req.body.message
  }, function(err){
    if(err){
      console.log('On a une erreur!');return;
    }
    res.send('Email envoyé');
  });

  }); 


app.listen(3000);
console.log('App is running');
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte