2016-05-03 14 views
3

Ich möchte Mail aus einem Postfach regelmäßig mit einem Node-Daemon abrufen. Der Aufruf der Verbindungsmethode erfolgt in app.js.Zugriff auf Javascript-Objekt - Umfang Problem mit Node.js

Die Javascript-Datei, die ich nutzen, um meine Mailbox (mail.js) zu verbinden:

var imap = new Imap({ 
    user: '[email protected]', 
    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; 

Wenn ich fetchMail() von mail.js direkt verwenden, ist alles in Ordnung.

Allerdings, wenn ich versuche, es zu nennen von app.js:

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

Dann wird das Verfahren Aufenthalt in der fetchMail() Funktion von mail.js und die imap.once('ready', function()) wird nie ausgelöst.

Ich denke, es ist ein Problem Bereich mit der imap var in mail.js.

Wie kann ich das beheben?

EDIT

Ich löste dies in einer Art und Weise Ich mag es nicht. Ich schrieb alles im Zusammenhang mit der Imap var innerhalb der fecthMail() Funktion.

Bitte zögern Sie nicht, eine effizientere Antwort zu diesem Thema zu schreiben.

+0

Haben Sie versucht, 'module.exports = Fetchmail;' in 'mail.js'? – gurvinder372

+0

Ja, aber 'fetchMail ist keine Funktion' in' app.js'. – Mornor

+0

Nicht in 'app.js', müssen Sie zuerst von' mail.js' exportieren und dann 'app.js' verwenden, indem Sie' require' eingeben. – gurvinder372

Antwort

1

Sie müssen das Ereignis jedes Mal binden, wenn Sie eine Verbindung herstellen. So ähnlich:

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(); 
}; 
+0

Danke! Ich bin in der Verbindungsphase immer noch blockiert. Es würde mir auch helfen, wenn du vielleicht ein bisschen deine Lösung erklären könntest? :) – Mornor

0

Der Ansatz und die Idee ist großartig. Sie müssen lediglich die Syntax der Datei mail.js ändern, um ein Modul zurückzugeben. In anderen Worten, wenn Sie

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

tun, was haben Sie in der E-Mail, variabel sein erwarten?

Möglicherweise müssen Logik um ändern, aber versuchen Sie dies:

var MailHandler = function() {} 

var imap = new Imap({ 
    user: '[email protected]', 
    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() 
+0

Danke :) Wie rufe ich dann die 'fetchMail()' -Funktion in 'app.js'? – Mornor

+0

Einfach: mail.fetchMail() –

+0

Ich glaube nicht. Da Sie beim Exportieren des MailHandler-Moduls eine Instanz von sich selbst erstellen. Diese Instanz wird durch den Aufruf von 'imap.once ('ready', function() {}); erstellt, was ausgelöst wird, wenn' imap.connect() 'fertig ist. Ich denke, in diesem Ansatz stimmt etwas nicht. Aber ich könnte falsch liegen, könnten Sie es erklären? – Mornor

Verwandte Themen