2016-07-28 143 views
2

我正在使用imap-simple NPM软件包来检查电子邮件,并且无法正确使插入操作。无法插入到使用流星1.3的NPM中进行采集

我已经阅读完此页面:https://guide.meteor.com/using-npm-packages.html#async-callbacks - 我已经尝试过这些建议,但是他们都没有工作!

我也简化了代码,试图让它工作,但仍然没有运气。

这个问题应该很容易重现 - 流星npm安装imap-simple,将上面的代码放到服务器上,添加一些电子邮件凭据,然后调用方法。

这里是我的代码:

var imaps = require('imap-simple'); 
var config = { 
    imap: { 
     user: '<removed>', 
     password: '<removed>', 
     host: 'imap.gmail.com', 
     port: 993, 
     tls: true, 
     authTimeout: 3000 
    } 
}; 

Meteor.methods({ 

    api_connectEmail: function() { 
     console.log('Received call to connect email'); 

     imaps.connect(config).then(function (connection) { 

      return connection.openBox('INBOX').then(function() { 
       var searchCriteria = [ 
        'UNSEEN' 
       ]; 

       var fetchOptions = { 
        bodies: ['HEADER', 'TEXT'], 
        markSeen: true 
       }; 

       return connection.search(searchCriteria, fetchOptions).then(function (results) { 
        results.map(function (res) { 

         var subject = res.parts.filter(function (part) {return part.which === 'HEADER';})[0].body.subject[0]; 
         console.log("Subject: " + subject); 

         // insert 
         var attributes = { 
          subject: subject 
         }; 
         console.log("Attempting to insert to collection..."); 
         var newData = TempEmailCollection.insert(attributes); 
         console.log("New Database Entry ID: " + newData); 

        }); 
       }); 
      }); 
     }) 
    } 
}); 

与主题的的console.log工作。插入不起作用。没有错误,没有console.log后插入,没有。

我已经尝试了在指南中推荐的两种策略,都没有工作。

+0

什么是TempEmailCollection? – Darren

+0

@Darren一个Mongo收集专门用于包含邮件信息。通常在流星的任何地方,.insert都适用于集合。但不是在NPM模块上。而传统的解决方法并不适合我。 –

+0

您需要显示其代码;这整个问题似乎是相关的,而不是电子邮件(你说的工作) – Darren

回答

0

问题是你正在异步调用一个叫做Promise处理程序的Meteor函数。然而,在服务器上调用的所有Meteor函数都必须在光纤中运行。 流星实际上在这种情况下抛出一个错误,但是你忽略它,因为你没有为Promises指定catch函数。

考虑以下简化的例子(它只是连接到服务器,并试图插入一个新的文档):

import { Meteor } from 'meteor/meteor'; 
import imaps from 'imap-simple'; 

const Storage = new Mongo.Collection('storage'); 

const config = { 
    imap: { 
    … 
    } 
}; 

Meteor.methods({ 
    connect() { 
    console.log('Method called'); 

    imaps.connect(config).then(function(connection) { 
     console.log('Connected'); 

     Storage.insert({ 
     value: 'success' 
     }); 

     console.log('Document inserted'); 
    }) 
    .catch(function(err) { 
     console.error(err); 
    }); 
    } 
}); 

以下消息将在catch功能到达:

[Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.]

你可以这样做来包装insert电话:

Meteor.methods({ 
    connect() { 
    console.log('Method called'); 

    const insert = Meteor.bindEnvironment(function() { 
     Storage.insert({ 
     value: 'success' 
     }); 
    }); 

    imaps.connect(config).then(function(connection) { 
     console.log('Connected'); 
     insert(); 
     console.log('Document inserted'); 
    }) 
    .catch(function(err) { 
     console.error(err); 
    }); 
    } 
}); 

然后按预期插入文档。