はい、データを受信するために、サーバーから 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);
}