【问题标题】:Access Javascript object - Scope issue with Node.js访问 Javascript 对象 - Node.js 的范围问题
【发布时间】:2016-08-28 07:59:05
【问题描述】:

我想定期使用 Node 守护程序从邮箱中获取邮件。对连接方法的调用是在app.js 中进行的。

我用来连接邮箱的javascript文件(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;

如果我直接从mail.js 使用fetchMail(),一切都很好。

但是,当我尝试从app.js 调用它时:

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

然后,该方法保留在来自mail.jsfetchMail() 函数中,并且永远不会触发imap.once('ready', function())

我猜这是mail.js 中的imap var 的范围问题。

我该如何解决这个问题?

编辑

我以我不喜欢的方式解决了这个问题。我在fecthMail()function 中写了与 imap var 相关的所有内容。

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

【问题讨论】:

  • 你在mail.js 中尝试过module.exports = fetchMail; 吗?
  • 是的,但是fetchMail is not a functionapp.js 中。
  • 不在app.js,你需要先从mail.js导出,然后通过app.js使用require
  • 是的。这就是我所做的:)
  • 很遗憾,没有。

标签: javascript node.js scope


【解决方案1】:

每次连接时都需要绑定事件。就像这样:

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

【讨论】:

  • 谢谢!我仍然在连接阶段被阻止。如果您可以解释一下您的解决方案,它也会对我有所帮助吗? :)
【解决方案2】:

方法和想法很棒。您只需更改 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()

【讨论】:

  • 谢谢 :) 然后我如何在app.js 中调用fetchMail() 函数?
  • 简单:mail.fetchMail()
  • 我不这么认为。从那时起,当您导出 MailHandler 模块时,您就创建了一个自身的实例。这个实例是通过调用imap.once('ready', function(){}); 创建的,它在imap.connect() 完成时触发。我认为这种方法有些不对劲。但我可能错了,你能解释一下吗?
  • 嗯。你必须找出什么对你有用。但是可以肯定的是,当你执行 require 时,它​​会加载里面的任何内容,但它不会注册一次事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
相关资源
最近更新 更多