gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:52:05 27 4
gpt4 key购买 nike

我正在使用 imap-simple NPM 包来检查电子邮件,但我无法让插件正常工作。

我已经通读了这个页面:https://guide.meteor.com/using-npm-packages.html#async-callbacks - 我已经尝试了这些建议,但没有一个有效!

我还稍微简化了代码以尝试使其正常工作,但仍然没有成功。

问题应该很容易重现——meteor npm install imap-simple,把上面的代码扔到服务器上,添加一些email凭证,然后调用方法。

这是我的代码:

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 函数:

[错误:Meteor 代码必须始终在 Fiber 中运行。尝试使用 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);
});
}
});

然后文档将按预期插入。

关于javascript - 无法使用 Meteor 1.3 从 NPM 插入集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38645764/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com