在服务器上运行函数后插入新集合

时间:2018-03-09 05:38:45

标签: meteor

当我从googles API返回地理编码时,我试图将其保存到我的数据库中。我一直试图使用下面的代码,只是插入一个没有运气的测试文档。我认为这与流星异步有关。如果我在googleMapsClient.geocode函数之前运行insert函数,它可以正常工作。有人能告诉我我做错了什么。

Meteor.methods({
  'myTestFunction'() {
    googleMapsClient.geocode({
      address: 'test address'
    }, function(err, response) {
      if (!err) {
        Test.insert({test: 'test name'});
      }
    });
}
});

3 个答案:

答案 0 :(得分:1)

我现在看到你在客户端运行NPM库的想法,但这不是你真正想要的。当您运行您在此处提供的初始代码时,您应该在流星实例的服务器端出现一些错误。问题是谷歌npm库在它自己的线程中运行,这阻止我们使用Meteor的方法。你可以做的最简单的事情是用Meteor.wrapAsync包裹函数,所以它看起来像这样。

try {
  var wrappedGeocode = Meteor.wrapAsync(googleMapsClient.geocode);
  var results = wrappedGeocode({ address : "testAddress" });
  console.log("results ", results);
  Test.insert({ test : results });
} catch (err) {
  throw new Meteor.Error('error code', 'error message');
}

您可以在looking at this thread找到更多信息,其他人也可以处理相同的问题

答案 1 :(得分:0)

您应该在客户端运行googleMapsClient.geocode()函数,并在服务器端运行Test.insert()函数(通过方法)。试试这个:

服务器端

Meteor.methods({
  'insertIntoTest'(json) {
    Test.insert({results: json.results});
  }
});

客户端

googleMapsClient.geocode({
  address: 'test address'
}, function(err, response) {
  if (!err) {
    Meteor.call('insertIntoTest', response.json);
  }
});

答案 2 :(得分:0)

Meteor Methods应该同时适用于serverclient方面。因此,请确保服务器可以访问您的方法;通过/server/main.js或正确的folder structuring正确导入。 (如果一个方法包含在服务器上运行的秘密逻辑,那么它应该与在服务器和客户端上运行的方法隔离开来)