1

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

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

我是 Meteor 顶部的 TypeScript 层的新手,它让我陷入循环。我通常一直在关注 Angular-Meteor 2.0 教程,但还没有涉及到这类事情。

4

2 回答 2

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,因为我可以将所有流星调用包装在 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);
    }
于 2015-12-29T02:14:04.310 回答
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);

 }

});

在 server/ 文件夹中,一个文件包含如下方法

Meteor.methods({
'importCsvServer': function(id) {

……

在 server/main.ts 中,我导入集合/方法/文件名。在 client/app.ts 我导入了同样的东西。客户端 Meteor.call 成功调用第一个方法,然后调用 server/ 文件夹中的第二个方法。

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

Angular2-Meteor 问题 74

于 2016-01-26T00:17:02.117 回答