是的,您可以直接从服务器调用 Web 服务以接收数据。我不太确定你是怎么做的,Meteor.methods/Meteor.call
并说它不起作用。但基本上,这个想法是客户端将单击按钮,然后按钮将触发服务器上的一个方法。然后,服务器方法将调用 Web 服务并返回数据。
一些示例代码可能是:
Template['template'].events({
'click .getData': function(event: any) {
Meteor.call('serverMethod', function(err, res) {
if (err) {alert(err);}
else { ... }
)
}
});
调用其余部分时新来者的棘手部分是您需要使用aysnc
调用才能将数据返回给客户端。我们通常为此制作辅助函数
public static get(url: string, headers: any): any {
var httpCall = Meteor.wrapAsync(HTTP.call);
var result = httpCall('GET', url, {headers: headers});
if (result.statusCode == 200) {
try {
var res = JSON.parse(result.content);
return res;
} catch(err) {
return result.content;
}
}
return null;
}
并像这样调用助手
public static serverMethod(username: string, password: string): any {
var response = RestService.get(query.url, query.header);
return response;
}
这样,res
上面客户端代码中的 就会得到结果。
实际上,由于缺少文档,我放弃了 Angular 2,但我的系统仍然使用 Typescript,因为我可以将所有流星调用包装在 Typescript 类中,正如您在我的示例中看到的那样,serverMethod
是 typescript 函数格式,而不是流星就像Meteor.methods({....})
,现在真的很好
通常,这是我的服务器文件夹中的一个类
// server/rest.service.ts
declare var RestService: any;
RestService = class RestService {
methodMap = {
"getFromRest": RestService.get,
"postToRest": RestService.post,
};
constructor() {
var abstractService = new AbstractService();
abstractService.registerMethod(this.getClassName(), this.methodMap);
}
getClassName(): string {
return this.constructor.toString().match(/\w+/g)[1];
}
//------------------------------------------------------------------------------------
// Helper methods
//------------------------------------------------------------------------------------
public static get(url: string, headers: any): any {
var httpCall = Meteor.wrapAsync(HTTP.call);
var result = httpCall('GET', url, {headers: headers});
if (result.statusCode == 200) {
try {
var res = JSON.parse(result.content);
return res;
} catch(err) {
return result.content;
}
}
return null;
}
我有一个类将打字稿服务映射到meteor
方法
// server/abstract.service.ts
declare var AbstractService: any;
AbstractService = class AbstractService {
constructor() {}
public registerMethod (scopeName: string, methodMap: {[key:string]:any}) {
var scopeMap: {[key:string]: any} = {};
for (var key in methodMap) {
scopeMap[scopeName + '.' + key] = methodMap[key];
}
Meteor.methods(scopeMap);
}