我关注的是我使用Meteor.call的标准方式,但在这种情况下它表现得很奇怪:
客户端:
Template.sometemplate.events({
'submit .somebutton'(event){
...
Meteor.call('stuff.someMethod', param1, function (err, res){
console.log(err);
console.log(res);
};
}
})
服务器/api/stuff.js:
Meteor.methods({
'stuff.someMethod'(param1){
...
Meteor.call('otherstuff.someOtherMethod', param1, function(err, res){
if(err){ throw new Meteor.Error(400,'wrong things');}
if(res) { return 'ok';}
}
);
}
})
服务器/api/otherstuff.js:
Meteor.methods({
'otherstuff.someOtherMethod'(param1){
...
return OtherStuff.findOne(query);
}
})
在客户端,我单击并立即查看console.log,将err和res视为未定义。在应用程序的其他部分,当客户端调用服务器方法而不调用另一个方法时,客户端在执行异步回调之前等待答案。
在调用另一个服务器方法的服务器方法中使用Meteor.call的方式肯定有问题。场景是,例如我想插入一个文档,同时这样做我想检查一些值,以便将它链接到其他集合中的其他文档。
非常感谢, 吨。
答案 0 :(得分:3)
在服务器上使用Meteor.call不需要回调,除非你真的想在服务器端工作异步。
如果未在服务器上传递回调,则调用方法 将阻止,直到方法完成。它最终会回归 返回方法的值,否则会抛出异常 方法抛出异常。 (如果是,可能映射到500服务器错误 异常发生在远程,它不是Meteor.Error异常。)
您可以返回结果
,而不是传递回调 [object Object] undefined bob Hello bob
或将其分配给用于进一步处理的变量。
return Meteor.call(...)
如果两个流星方法依赖于相同的代码(例如,一个调用另一个),则应将此代码提取到共享函数中。这使得测试和跟踪错误也更容易。
服务器/ API / common.js 强>
const retVal = Meteor.call(...)
服务器/ API / stuff.js:强>
export const sharedFunction = function(param1) {
// ... do somethin
return OtherStuff.findOne(query);
}
服务器/ API / otherstuff.js 强>
import { sharedFunction } from './common.js';
Meteor.methods({
'stuff.someMethod'(param1){
// ...
const temp = sharedFunction(param1);
// ...
return result; // or temp if this should be returned to client
}
})
使用import { sharedFunction } from './common.js';
Meteor.methods({
'otherstuff.someOtherMethod'(param1){
return sharedFunction(param1);
}
});
遵循DRY和Single Point of Failure的概念。