我刚学习Meteor,我做了一个小应用程序,但我在服务器端遇到find()
和update()
集合有问题
例如:
if (Meteor.isServer) {
function getCollection1(){
return collection_1.find({}).fetch({});
}
....
Meteor.methods({
start: function(id) {
datas = getCollection1();
Collection2.update({_id:id}, {$set: {datas: datas}}); //sometimes it's ok(3/4)
}
...
}
或者当我等待时,我有一个错误
if (Meteor.isServer) {
async function getCollection1(){
return await collection_1.find({}).fetch({});
}
....
Meteor.methods({
start: function(id) {
getCollection1().then(function(datas){
Rooms.update({_id: id}, {$set: {datas: datas}},function(err){
console.log(err);//error: Meteor code must always run within a fiber
});
});
}
...
}
我做错了什么?
修改
它似乎与Fiber()
配合得很好if (Meteor.isServer) {
Fiber = Npm.require('fibers')
function getCollection1(){
return collection1.find({}).fetch({});
}
function setCollection2(id){
Fiber(function() {
datas = getCollection1();
collection2.update({_id: id}, {$set: {datas: datas}},function(err){
console.log(err);
});
}).run();
}
....
Meteor.methods({
start: function(id) {
setCollection2(id);
}
...
}
答案 0 :(得分:0)
使用async / await版本,您不需要使用光纤。相反,你可以使用这个Meteor功能:Meteor.bindEnvironment
使其工作:
// ...
getCollection1().then(Meteor.bindEnvironment(function(datas){
Rooms.update(// ...);
}));
// ...
有关更易理解的解释,请参阅此视频:
答案 1 :(得分:-1)
根据您提供的代码,我的猜测是第一个例子" Collection2.update"在GetCollection1()完成之前发生。如果情况确实如此,那么在您订阅该集合时,在客户端,请确保有一种方法来等待"订阅完成。
例如在客户端这样的东西,其中" start()"被称为......
const handle = Meteor.subscribe( 'collection_1' );
if ( handle.ready() ) {
Meteor.call('start');
} else {
const allusers = Meteor.users.find().fetch();
onData( null, {allusers} );
}
同样,这是我最好的猜测,因为您没有在第一个代码块中发布您收到的错误,而且我无法说出您尝试实施此错误的第二个错误。