无法使用Meteor 1.3插入到NPM的收集

我正在使用imap-simple NPM软件包检查电子邮件,并且无法正确使用插入。

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

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

问题应该很容易重现 – meteornpm安装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后插入,什么都没有。

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

问题在于你正在asynchronous地调用一个叫做Promise处理程序的Meteor函数。 但是,在服务器上调用的所有Meteor函数都必须在光纤中运行。 meteor实际上在这种情况下抛出一个错误,但是你忽略了它,因为你没有为Promise指定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); }); } }); 

然后按预期方式插入文档。