通过Metro.call()传递时从对象中剥离的方法

时间:2016-07-17 21:12:34

标签: javascript node.js meteor

我目前正在尝试让node-hue-api npm库在我的MeteorJS项目中运行。我已经完成了网桥搜索和连接工作(虽然它完全不遵循Meteor方式)。然而,我仍然坚持寻找灯光。

要获得经过身份验证的客户端,我在桥接组件方法中定义了以下代码:

import { Settings } from '../../settings/settings';
import { HueApi } from 'node-hue-api';

Meteor.methods({
    'philipsHue.bridges.client'() {
        const hueSettings = Settings.findOne({ type: 'philips-hue' });
        return new HueApi(hueSettings.hostname, hueSettings.username);
    }
});

在我的光方法(不同文件)中,我现在调用此方法来获取经过身份验证的客户端:

Meteor.methods({
    'lights.scan'() {
        var hueClient = new HueApi(Meteor.call('philipsHue.bridges.client'));
        hueClient.lights().then((val) => {
            val.lights.forEach(function (hueLight) {
                let dbLight = Lights.findOne({ id: hueLight.id });

                if (dbLight) {
                    // we already have a db copy of this light, check for changes
                }
                else {
                    // we need a new local copy for this light
                    dbLight.insert(hueLight);
                }
            })
        });
    }
});

返回的HueApi对象具有正确的变量,但它已被剥离所有方法 - 导致我未定义的方法错误。只有通过Meteor.call()传递的对象才会发生这种情况,如果我在同一个函数中创建方法,那么方法就在那里。

这是我遇到问题的图书馆的类:GitHub

导致此方法剥离行为的原因是什么?我该如何解决?

1 个答案:

答案 0 :(得分:1)

从上面的评论发表...

流星方法适用于DDP,我几乎可以肯定他们只发送JSON而不是完整的对象"用方法等。您可以使用Chrome的开发工具查看Meteor通过方法调用等发送的内容,然后转到“网络”选项卡,然后在WS(Web套接字)上进行过滤。正如您必须转换Collection查询结果的结果一样,您可能必须执行类似的操作以使原始JSON转换回所需的完整对象。请记住,JavaScript并没有真正处理对象"而是使用原型来模拟它们。