为什么 Meteor.call() 不被识别?

Why is Meteor.call() not recognized?

这个问题已经从它的 演变而来,有人建议我 post 一个新问题。

当我调用我的“insertPerson”方法,然后调用我的“getTextAddrAsEmailAddr”方法时,我看到,在控制台中,我的两个调试 console.log 消息:

I20151022-07:59:07.240(-7)? insertPerson reached
I20151022-07:59:07.365(-7)? phone is 0871632810

...后跟此异常:

I20151022-07:59:07.365(-7)? Exception while invoking method 'insertPerson' TypeE
rror: Cannot call method 'call' of undefined
I20151022-07:59:07.365(-7)?     at [object Object].Meteor.methods.getTextAddrAsE
mailAddr (both/methods.js:37:28)

注意:methods.js 中的第 37 行是:

return Meteor.http.call("GET", restcall);

对于上下文,整个 methods.js 文件是:

Meteor.methods({
    'insertPerson': function(firstname, lastname, streetaddr1, streetaddr2, placename, stateorprov, zipcode, emailaddr, phone, notes) {
        console.log('insertPerson reached'); // TODO: Remove before deploying
        check(firstname, String);
        . . .
        console.log('phone is ' + phone);
        var textAddrAsEmailAddr = Meteor.call('getTextAddrAsEmailAddr', phone);
        console.log('textAddrAsEmailAddr is ' + textAddrAsEmailAddr);

        People.insert({
            per_firstname: firstname,
            per_lastname: lastname,
            per_streetaddr1: streetaddr1,
            per_streetaddr2: streetaddr2,
            per_placename: placename,
            per_stateorprov: stateorprov,
            per_zipcode: zipcode,
            per_emailaddr: emailaddr,
            per_phone: phone,
            per_textaddrasemailaddr: phone,
            per_notes: notes,
            per_createdBy: this.userId
        });
    },
    'getTextAddrAsEmailAddr': function(phone) {
        this.unblock();
        var restcall = 'http://www.reminder.com/phone.check.php?number=' + phone;
        return Meteor.http.call("GET", restcall);
    }
});

我的 Meteor.http.call() 调用有问题吗?

根据 docs.

应该是 HTTP.call() 而不是 Meteor.http.call()

(同时确保您已添加带有 meteor add http 的包)。

好吧,它在文档中并没有写成一个硬道理,但我很确定,Meteor.call() 预计会从客户端到服务器进行远程调用。

此外,我想知道,你已经"on server side".

,为什么会在这个时候做一个Meteor.call()

尝试:

function getTextAddrAsEmailAddr(scope, phone) {
    scope.unblock();
    var restcall = 'http://www.reminder.com/phone.check.php?number=' + phone;
    return HTTP.get(restcall);
}

Meteor.methods({
  'insertPerson': function(firstname, lastname, streetaddr1, streetaddr2, placename, stateorprov, zipcode, emailaddr, phone, notes) {
     console.log('insertPerson reached'); // TODO: Remove before deploying
     check(firstname, String);
     . . .
     console.log('phone is ' + phone);
     var textAddrAsEmailAddr = getTextAddrAsEmailAddr(this, phone);
     console.log('textAddrAsEmailAddr is ' + textAddrAsEmailAddr);

     People.insert({
        per_firstname: firstname,
        per_lastname: lastname,
        per_streetaddr1: streetaddr1,
        per_streetaddr2: streetaddr2,
        per_placename: placename,
        per_stateorprov: stateorprov,
        per_zipcode: zipcode,
        per_emailaddr: emailaddr,
        per_phone: phone,
        per_textaddrasemailaddr: phone,
        per_notes: notes,
        per_createdBy: this.userId
    });

    return true;
  }
});

如果您希望函数 getTextAddrAsEmailAddr 也可用作 Meteor 方法,只需添加:

'getTextAddrAsEmailAddr': function(phone) {
    return getTextAddrAsEmailAddr(this, phone);
}

希望能为您解决问题

干杯 汤姆


更新:

我想知道使用 Meteor.call()

的开销和正确性
  1. 你可以随时随地使用它

  2. 注意开销

Meteor.call 定义于:

Package ddp-client/livedata_connection.js L665

并将一直通过 Meteor.apply 运行,定义在:

Package ddp-client/livedata_connection.js L706

如果您从 L707-L912 检查该来源,我想这并不奇怪,直接调用该函数的建议效率更高。