我在使用 Fibers/Meteor.bindEnvironment() 时遇到了困难。如果集合开始为空,我尝试更新代码并将其插入集合。这一切都应该在启动时在服务器端运行。
function insertRecords() {
console.log("inserting...");
var client = Knox.createClient({
key: apikey,
secret: secret,
bucket: 'profile-testing'
});
console.log("created client");
client.list({ prefix: 'projects' }, function(err, data) {
if (err) {
console.log("Error in insertRecords");
}
for (var i = 0; i < data.Contents.length; i++) {
console.log(data.Contents[i].Key);
if (data.Contents[i].Key.split('/').pop() == "") {
Projects.insert({ name: data.Contents[i].Key, contents: [] });
} else if (data.Contents[i].Key.split('.').pop() == "jpg") {
Projects.update( { name: data.Contents[i].Key.substr(0,
data.Contents[i].Key.lastIndexOf('.')) },
{ $push: {contents: data.Contents[i].Key}} );
} else {
console.log(data.Contents[i].Key.split('.').pop());
}
}
});
}
if (Meteor.isServer) {
Meteor.startup(function () {
if (Projects.find().count() === 0) {
boundInsert = Meteor.bindEnvironment(insertRecords, function(err) {
if (err) {
console.log("error binding?");
console.log(err);
}
});
boundInsert();
}
});
}
我第一次写这篇文章时,我遇到了错误,我需要将我的回调包装在 Fiber() 块中,然后在 IRC 的讨论中有人建议尝试 Meteor.bindEnvironment(),因为那应该将它放在 Fiber 中。那没有用(我看到的唯一输出是inserting...
,这意味着 bindEnvironment() 没有抛出错误,但它也没有运行块内的任何代码)。然后我到了这个。我现在的错误是:Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
我是 Node 新手,并不完全理解 Fibers 的概念。我的理解是,它们类似于 C/C++ 中的线程/每种语言中的线程,但我不明白扩展到我的服务器端代码的含义是什么/为什么我的代码在尝试插入时抛出错误一个集合。谁能给我解释一下?
谢谢你。