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