流星/光纤 - 如何使用Meteor.call回调?

时间:2015-10-08 19:23:10

标签: serialization meteor fiber

我有这个代码,我从客户端调用Meteor方法,并期望在回调中得到一个结果。 results对象是一个格式良好的对象,我可以从服务器的控制台进行字符串化和打印。

当我运行此代码时,如果结果有效并且没有错误,则不会在客户端上调用回调。但是,如果我用fut.return(results)替换fut.return(JSON.parse(JSON.stringify(results))),则会调用回调,并在客户端中获得“字符串”。知道为什么我可以返回一个字符串但没有对象吗?

服务器代码(在Meteor.Methods()中):

getUserEvents : function(userId,start,end) {
        var fut = new Future();
        getUserEventsPrivate(userId,start,end,function(err,results){
            if(err){
                fut.throw(new Meteor.Error( 500, 'Oops, something wrong happened'));
            }else{
                fut.return(results); // works when fut.return(JSON.parse(JSON.stringify(results)));
            }
        });
        return fut.wait();
    }

客户端:

Meteor.call('getUserEvents',Meteor.user()._id, startStr, endStr,function(err,results){
    console.log(results);
});

修改 这是Json,我试图将其作为'结果'传递:

[
  {
    "title": "ResponsiveMTL #1",
    "start": "2015-10-13T21:30:00.000Z",
    "end": "2015-10-14T00:30:00.000Z"
  },
  {
    "title": "Meteor Global Distributed Hackathon",
    "start": "2015-10-10T15:00:00.000Z",
    "end": "2015-10-11T15:00:00.000Z"
  },
  {
    "title": "retenues a la source",
    "start": "2015-10-08T19:25:00.275Z",
    "end": "2015-10-08T19:25:00.275Z"
  },
  {
    "title": "Salsa",
    "start": "2015-09-19T22:00:00.000Z",
    "end": "2015-09-19T23:00:00.000Z"
  },
  {
    "title": "Salsa",
    "start": "2015-10-09T22:00:00.000Z",
    "end": "2015-10-09T23:00:00.000Z"
  }
]

1 个答案:

答案 0 :(得分:1)

完全有可能以这种方式返回一个对象。

您的对象可能不是开箱即用的EJSON序列化版本,但如果不实际查看其中的示例,很难说清楚。

例如,如果您的对象包含循环引用,EJSON将无声地失败并且您的回调不会被调用。这种情况不太可能,因为您可以让JSON序列化它。

您可以尝试查找有问题的属性并对其进行修改,但将其注册为带有EJSON的自定义类型可能是个好主意。

http://docs.meteor.com/#/full/ejson_add_type

无论如何,看到你的实际物品并能够说出更多信息会很有趣 您使用的是什么版本的Meteor?