Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无法使用Meteor 1.3从NPM插入到集合_Javascript_Node.js_Mongodb_Meteor_Npm - Fatal编程技术网

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

Javascript 无法使用Meteor 1.3从NPM插入到集合,javascript,node.js,mongodb,meteor,npm,Javascript,Node.js,Mongodb,Meteor,Npm,我正在使用imap simple NPM软件包检查电子邮件,但我很难让插件正常工作 我已经阅读了本页:-我尝试过这些建议,但没有一个有效 我也简化了代码,只是为了让它工作,但仍然没有运气 问题应该很容易重现-meteor npm安装imap simple,在服务器上抛出上述代码,添加一些电子邮件凭据,然后调用该方法 这是我的密码: var imaps = require('imap-simple'); var config = { imap: { user: '<r

我正在使用imap simple NPM软件包检查电子邮件,但我很难让插件正常工作

我已经阅读了本页:-我尝试过这些建议,但没有一个有效

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

问题应该很容易重现-meteor 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);

                    });
                });
            });
        })
    }
});
var-imaps=require('imap-simple');
变量配置={
imap:{
用户:“”,
密码:“”,
主持人:“imap.gmail.com”,
港口:993,
tls:没错,
授权超时:3000
}
};
流星法({
api_connectEmail:函数(){
log('接收到连接电子邮件的呼叫');
connect(配置)。然后(函数(连接){
返回连接。openBox(“收件箱”)。然后(函数(){
var搜索条件=[
“看不见的”
];
var fetchOptions={
正文:[“标题”、“正文”],
马克西:是的
};
返回connection.search(searchCriteria,fetchOptions).then(函数(results){
结果图(功能(res){
var subject=res.parts.filter(函数(part){return part.which=='HEADER';})[0].body.subject[0];
控制台日志(“主题:+主题”);
//插入
变量属性={
主题:主题
};
log(“试图插入到集合…”);
var newData=tempailcollection.insert(属性);
log(“新数据库条目ID:+newData”);
});
});
});
})
}
});
带有主题的console.log正在运行。插入件不起作用。无错误,无console.log post插入,无任何内容


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

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

考虑以下简化示例(它仅连接到服务器并尝试插入新文档):

以下消息将到达
catch
功能:

[错误:Meteor代码必须始终在光纤中运行。请尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。]

您可以这样做来包装
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);
    });
  }
});

然后,文档将按预期插入。

什么是TempEmailCollection?@Darren专门用于包含邮件信息的Mongo集合。通常在Meteor.insert中的任何地方都可以使用集合。但不是在NPM模块上。传统的工作方式对我来说并不适用;整个问题似乎与此有关,而不是电子邮件(你说它正在工作)@Darren我想你误解了。在Meteor中,集合没有“代码”。创建一个集合需要一行代码——tempeEmailCollection=newmongo.collection('temp_email');在Meteor项目的任何地方,你都可以操作集合,除了NPM,它似乎运行在不同的光纤上。更具体地说,NPM模块工作正常。但是范围是错误的-NPM不能使用Meteor的mongo收集功能。我提供的链接解释了如何解决这个问题,但解决方法在这种情况下没有帮助,可能是因为搜索功能是如何工作的。
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);
    });
  }
});