在meteor中尝试通过从客户端制作Meteor.call来插入新文档。一切正常,除了我想将创建文档的id返回给客户端,以便我可以重定向到正确的URL。
我有类似的东西(客户端):
Meteor.call('scenarioCreate', scenarioObj, function(err, response) {
if(err) {
console.warn(err);
return;
}
console.info(response);
});
在服务器上:
Meteor.methods({
'scenarioCreate': function(scenarioObj) {
Scenarios.insert( scenarioObj, function(err, id) {
console.info("new id: "+id);
if (err) {
console.warn(err);
throw new Meteor.Error(404, 'Something went wrong');
}
return id;
});
}
});
从服务器端我得到控制台日志“new id:DDaq4aWsGf3fxG7RP”,但我应该在客户端上获得“响应”值的相同值,但我总是得到未定义。< / p>
任何人都可以向我解释为什么或我做错了什么。
答案 0 :(得分:4)
Meteor.methods
不会等待你的回调。试试这个:
在服务器上:
Meteor.methods({
'scenarioCreate': function(scenarioObj) {
var newId = Scenarios.insert(scenarioObj);
return newId;
}
});
要捕获任何错误,请使用try/catch
注意:如果您仍想使用回调,请结帐fibers/future
。
答案 1 :(得分:1)
您的第一个错误是您在id
的回调中返回insert
。这没有任何作用。然后你的第二个不知道方法是同步执行的。这意味着您只能使用Meteor.wrapAsync
使用回调中可用的信息。但这不仅仅是重点。 insert
函数返回新的_id
。意思是你可以这样做:
Meteor.methods({
'scenarioCreate': function(scenarioObj) {
return Scenarios.insert( scenarioObj );
}
});