使用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事件。