当用户在客户端添加新条目时,我需要从服务器进行Web服务调用(客户端代码将无法访问),并向MongoDB中存储的数据添加一些其他信息。 尝试使用标准的Meteor.methods / Meteor.call模式似乎不起作用。
我是否需要在"添加"上收听点击事件?服务器和客户端上的按钮? 我应该在服务器响应的客户端上引发自定义事件吗? 是否有正确的方法直接调用服务器端方法? 最重要的是,我如何让TypeScript在这一切中保持高兴?
我是Meteor上的TypeScript图层的新手,它让我循环播放。我一直在关注2.0的Angular-Meteor教程,但这种事情还没有涵盖。
答案 0 :(得分:1)
是的,您可以直接从服务器调用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,因为我可以将所有的meteor调用包装在Typescript类中,正如你在我的例子中看到的那样,serverMethod
是打字稿功能格式,不像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;
}
我有一个类将typescript服务映射到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);
}
答案 1 :(得分:0)
使用angular2,Meteor和Typescript,有效的方法是链接Meteor.methods。
首先在客户端上,响应按钮单击
...
Meteor.call('importCsv',id,function(error,result){
...
在collections / methods文件夹或类似文件夹中,我按如下方式定义方法:
Meteor.methods({
'importCsv': function(id) {
console.log('importCsv method on client');
Meteor.call('importCsvServer',id);
}
});
在服务器/文件夹中,文件包含以下方法
Meteor.methods({
'importCsvServer': function(id) {
...
在server / main.ts中我导入collections / methods / filename。在client / app.ts中,我导入了同样的东西。客户端Meteor.call成功调用第一个方法,然后调用服务器/文件夹中的第二个方法。
我的目标是在客户端发起的服务器上进行一堆处理。当我在导入到客户端和服务器的集合/方法中定义的方法中进行函数调用时,会导致编译器错误。