当我从googles API返回地理编码时,我试图将其保存到我的数据库中。我一直试图使用下面的代码,只是插入一个没有运气的测试文档。我认为这与流星异步有关。如果我在googleMapsClient.geocode
函数之前运行insert函数,它可以正常工作。有人能告诉我我做错了什么。
Meteor.methods({
'myTestFunction'() {
googleMapsClient.geocode({
address: 'test address'
}, function(err, response) {
if (!err) {
Test.insert({test: 'test name'});
}
});
}
});
答案 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
应该同时适用于server
和client
方面。因此,请确保服务器可以访问您的方法;通过/server/main.js
或正确的folder structuring正确导入。
(如果一个方法包含在服务器上运行的秘密逻辑,那么它应该与在服务器和客户端上运行的方法隔离开来)