3 votes

Accéder à un objet Javascript - problème de portée avec Node.js

J'aimerais récupérer régulièrement le courrier d'une boîte aux lettres en utilisant un démon Node. L'appel à la méthode de connexion est effectué dans app.js .

Le fichier javascript que j'utilise pour me connecter à ma boîte aux lettres ( mail.js ) :

var imap = new Imap({
    user: 'xxxx@hotmail.com',
    password: config.get.gmail_password,
    host: 'xxxxx',
    port: 993,
    tls: true
});

var fetchMail = function()
{
    console.log('Connection');
    imap.connect();
};

//fetchMail();

imap.once('ready', function() {
   console.log('Ready'); 

   imap.search([ 'UNSEEN', ['FROM', 'xxxx'] ], function(err, results)
   {
       // Do Stuff
   }

exports.fetchMail = fetchMail;

Si j'utilise fetchMail() directement de mail.js tout va bien.

Cependant, lorsque j'essaie de l'appeler depuis app.js :

var mail = require('./js/mail');
mail.fetchMail() 

Ensuite, la méthode reste dans le fetchMail() de la fonction mail.js et le imap.once('ready', function()) n'est jamais déclenché.

Je suppose que c'est un problème de portée avec le imap var dans mail.js .

Comment puis-je réparer cela ?

EDIT

J'ai résolu le problème d'une manière que je n'aime pas. J'ai écrit tout ce qui est lié à la variable imap à l'intérieur de la variable fecthMail() fonction.

N'hésitez pas à rédiger une réponse plus efficace à cette question.

1voto

Second Rikudo Points 59550

Vous devrez lier l'événement à chaque fois que vous vous connecterez. Donc, comme ça :

var fetchMail = function()
{
    console.log('Connection');

    imap.once('ready', function() {
      console.log('Ready');         
      imap.search([ 'UNSEEN', ['FROM', 'xxxx'] ], function(err, results)
      {
        // Do Stuff
      }
    }
    imap.connect();
};

0voto

Martin Gottweis Points 2337

L'approche et l'idée sont excellentes. Il suffit de modifier la syntaxe du fichier mail.js pour qu'il renvoie un module. En d'autres termes, lorsque vous faites

var mail = require('./js/mail');

qu'attendez-vous de la variable courrier ?

Vous devrez peut-être modifier la logique, mais essayez ceci :

var MailHandler = function () {}

var imap = new Imap({
    user: 'xxxx@hotmail.com',
    password: config.get.gmail_password,
    host: 'xxxxx',
    port: 993,
    tls: true
});

MailHandler.init = function(){
  imap.once('ready', function() {
     console.log('Ready'); 

     imap.search([ 'UNSEEN', ['FROM', 'xxxx'] ], function(err, results)
     {
         // Do Stuff
     }
  }
}

MailHandler.fetchMail = function()
{
  console.log('Connection');
  imap.connect();
};

//fetchMail();

module.exports = new MailHandler()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X