2015-10-22 1 views
0

Этот вопрос достаточно изменился с его ancestor, что было предложено задать новый вопрос.Почему Meteor.call() не распознается?

Когда я называю "insertPerson" метод, который затем вызывает мой метод "getTextAddrAsEmailAddr", я вижу, в консоли, мои две отладочные console.log сообщ:

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

.. .followed этим исключением:

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) 

ПРИМЕЧАНИЕ: Строка 37 в methods.js является:

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() вызов?

ответ

2

Это должно быть HTTP.call() не Meteor.http.call() согласно docs.

(Также убедитесь, что вы добавили пакет с meteor add http).

+0

Да, мне нужно было сделать обе эти вещи (удалите лишние «.http» и добавьте http-пакет. –

1

ОК, это не написано как жесткий факт внутри документов, но я уверен, что Meteor.call(), как ожидается, сделает удаленный вызов от клиента к серверу.

Кроме того, мне интересно, почему вы сделали бы Meteor.call() на этом этапе, когда вы уже «на стороне сервера».

Try:

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 доступной как метод Метеора, а также, просто добавьте:

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

Надежда, которая фиксирует это для вас

Приветствий Том


Update:

мне было интересно себя о накладных расходов и правильности об использовании Meteor.call()

  1. Вы можете использовать его везде и в любом месте

  2. Осознайте потолочной

Meteor.call определено в:

Package ddp-client/livedata_connection.js L665

и будет работать через Meteor.apply все время, которое определяется по адресу:

Package ddp-client/livedata_connection.js L706

Если вы убедитесь, что источник из L707-L912, я предполагаю, что это не интересно, что предложение позвонить функция непосредственно намного эффективнее.

+0

Какова цель «return true» в методе insertPerson()? –

+0

Я пробовал это и получил : «Исключение при моделировании эффекта вызова« insertPerson »Ошибка: не удается сделать блокирующий HTTP-вызов от клиента, требуется обратный вызов. (...) Ошибка: не удается сделать блокирующий HTTP-вызов от клиента, требуется обратный вызов». –

+0

Я сделал для вас MeteorPad, который должен дать вам правильный ход: http://meteorpad.com/pad/5hRPaC8y4BsRo6Ttf/MeteorCallSample –