将Meteor与Angular2 / Typescript一起使用,如何根据客户端事件从服务器端代码调用外部Web服务?

时间:2015-12-29 01:59:50

标签: meteor typescript angular angular2-meteor

当用户在客户端添加新条目时,我需要从服务器进行Web服务调用(客户端代码将无法访问),并向MongoDB中存储的数据添加一些其他信息。 尝试使用标准的Meteor.methods / Meteor.call模式似乎不起作用。

我是否需要在"添加"上收听点击事件?服务器和客户端上的按钮? 我应该在服务器响应的客户端上引发自定义事件吗? 是否有正确的方法直接调用服务器端方法? 最重要的是,我如何让TypeScript在这一切中保持高兴?

我是Meteor上的TypeScript图层的新手,它让我循环播放。我一直在关注2.0的Angular-Meteor教程,但这种事情还没有涵盖。

2 个答案:

答案 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成功调用第一个方法,然后调用服务器/文件夹中的第二个方法。

我的目标是在客户端发起的服务器上进行一堆处理。当我在导入到客户端和服务器的集合/方法中定义的方法中进行函数调用时,会导致编译器错误。

Angular2-Meteor issue 74