【问题标题】:Unable to call function in meteor package using method?无法使用方法调用流星包中的函数?
【发布时间】:2015-03-30 09:26:39
【问题描述】:

我正在尝试使用我在大气 (aldeed:geocoder) 上找到的使用 node-geocoder 包的地理编码器包。 meteor 包指定为了执行新的地理编码,我要创建一个新的 GeoCoder 实例,然后在其上调用 geocode 方法,传入一个地址字符串,如下所示:

var geo = new GeoCoder();
var result = geo.geocode("location");

如果我将上述内容放在我的应用程序和 console.log 结果的服务器文件中的 server.js 文件中,我会按预期将一个对象打印到终端。我遇到的问题是当我尝试使用流星方法调用它时,以响应来自搜索框的用户输入。我的模板助手里面有这个:

Template.layout.events({
    'submit form': function(e) {
        e.preventDefault();

    var search = {
        location: $(e.target).find('[name=search]').val()
    }

    console.log(search.location);

    Meteor.call('getGeoCode', search.location, function(result) {
        console.log(result)
    });
}

});

和集合的文件,forecasts.js 里面有这个:

Forecasts = new Mongo.Collection('forecasts');


    Meteor.methods({
        getGeoCode: function(search) {
            var geo = new GeoCoder();
            result = geo.geocode(search);
            return result;
        }
    });

但是当我尝试它时,我在控制台中收到一个错误,告诉我 GeoCoder 未定义。具体来说:

“模拟调用'getGeoCode'的效果时出现异常” ReferenceError: GeoCoder is not defined

那么,这里发生了什么?为什么不能在该方法中创建一个新的 GeoCoder 实例并像我一样调用它?

【问题讨论】:

    标签: javascript meteor meteorite


    【解决方案1】:

    从地理编码器的package.js 中可以看到,GeoCoder 命名空间和文件仅导出到服务器。您的错误表明该方法是在客户端上定义的。当您调用该方法时,客户端会尝试运行其版本并引发错误,因为它无权访问 GeoCoder API。

    最简单的解决方案就是在/server 目录下的文件中定义此方法。或者,您可以通过检查 Meteor.isServer 来包装共享方法定义。

    【讨论】:

    • 啊啊啊啊。好的,那么如果方法是在/server目录下的文件中定义的,还可以在模板助手中调用吗?
    • 是的,但是你的助手不应该有副作用。助手的工作是响应式读取和/或翻译数据,而不是更改状态。方法调用的更好位置是在renderedcreated 或事件处理程序中。
    猜你喜欢
    • 2016-08-24
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2023-04-04
    • 2017-01-11
    • 2015-06-26
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多