无法使用Meteor 1.3从NPM插入集合

Cannot insert to collection from NPM using Meteor 1.3

本文关键字:NPM 插入 集合 Meteor      更新时间:2023-09-26

我正在使用imap简单的NPM包来检查电子邮件,并且我在使插入正常工作时遇到了问题。

我已经通读了这一页:https://guide.meteor.com/using-npm-packages.html#async-回调-我尝试过这些建议,但都不起作用!

我也简化了一些代码,只是为了让它正常工作,但仍然没有运气。

这个问题应该很容易重现-流星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后插入,什么都没有。

我已经尝试了指南中推荐的两种策略,都不起作用。

问题是在异步调用Promise处理程序的内部调用Meteor函数。但是,服务器上调用的所有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);
    });
  }
});

然后将按预期插入文档。