无法使用Meteor 1.3从NPM插入集合
Cannot insert to collection from NPM using Meteor 1.3
我正在使用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);
});
}
});
然后将按预期插入文档。
相关文章:
- 可以前端maven插件使用节点,npm已经安装
- 将样式表插入iframe
- Ckeditor-plugin:插入虚假元素add不情愿<p>标签前后
- 尽管链接成功并已成功下载,但未找到NPM模块
- 如何动态插入jquery代码
- 动态插入的表:JQuery未检测到最后一行
- 使用JavaScript动态插入DIV的成本有多高
- 带有填充属性的SVG矩形显示在包含元素的上方插入框阴影
- 在Meteor项目中安装并包含npm模块后出错
- 将对象动态插入到现有对象中
- 将数组中的值插入到表中
- 在 Java 中的 JavaScript 函数中插入 Wicket 值
- 如何将本地依赖项添加到npm项目中
- 我如何在数字插入中使用逗号,这样它就不会'不要破坏我的输入字段
- 使用PHP插入HTML在JavaScript上不起作用
- javascript:将数据库中的数据插入到html5文本字段中
- 从数据库中获取数据并插入JavaScript变量
- 如何使用innerHtml正确插入html
- AngularJS指令,在元素后插入HTML
- 无法使用Meteor 1.3从NPM插入集合