使用Node.js访问Javascript对象-范围问题

使用Node.js访问Javascript对象-范围问题,javascript,node.js,scope,Javascript,Node.js,Scope,我想使用节点守护进程定期从邮箱获取邮件。在app.js中调用连接方法 用于连接邮箱的javascript文件(mail.js): 如果我直接从mail.js使用fetchMail() 但是,当我试图从app.js调用它时: var imap = new Imap({ user: 'xxxx@hotmail.com', password: config.get.gmail_password, host: 'xxxxx', port: 993, tls: tr

我想使用节点守护进程定期从邮箱获取邮件。在
app.js
中调用连接方法

用于连接邮箱的javascript文件(
mail.js
):

如果我直接从
mail.js
使用
fetchMail()

但是,当我试图从
app.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;
var mail = require('./js/mail');
mail.fetchMail() 
然后,该方法停留在
mail.js
中的
fetchMail()
函数中,而
imap.once('ready',function())
永远不会触发

我想这是
mail.js
imap
var的范围问题

我怎样才能解决这个问题

编辑

我用一种我不喜欢的方式解决了这个问题。我在
fectmail()
函数中编写了与imap变量相关的所有内容


请不要犹豫,写一个更有效的答案

每次连接时都需要绑定事件。一般来说:

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

方法和想法很棒。您只需更改mail.js文件的语法即可返回模块。换句话说,当你这样做的时候

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

您希望邮件变量中包含什么内容

您可能需要改变逻辑,但请尝试以下方法:

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()

您是否尝试过
module.exports=fetchMail
mail.js
中?是的,但是
fetchMail不是
app.js
中的一个函数。不是在
app.js
中,您需要首先从
mail.js
导出,然后通过执行
require
Yep来使用它。这就是我所做的:)不幸的是,没有。谢谢!我仍然在连接阶段受阻。如果您能解释一下您的解决方案,也会对我有所帮助谢谢:)那么我该如何调用
app.js
中的
fetchMail()
函数呢?简单:mail.fetchMail()我不这么认为。因为在导出MailHandler模块时,您创建了一个自身的实例。这个实例是通过调用
imap.once('ready',function(){})创建的
imap.connect()
完成时触发。我认为这种方法有点不对。但我可能错了,你能解释一下吗?嗯,你得找出适合你的方法。但可以肯定的是,当您执行require时,它将加载内部的任何内容,但不会注册once事件。