为什么alert de[fine]d,然后两行之后,就不是(Meteor)了?

Why is alert de[fine]d, and then two lines later, it's not (Meteor)?

我有这段代码可以将文档插入 MongoDB 集合:

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);
        . . .
        alert('phone is ' + phone);
        var textAddrAsEmailAddr = Meteor.call('getTextAddrAsEmailAddr', phone); 
        alert('textAddrAsEmailAddr is ' + textAddrAsEmailAddr);
        . . .

...我看到了第一个警报 ("phone is 087163281"),但没有看到第二个; Meteor 控制台显示警报未定义:

I20151022-07:22:49.659(-7)? insertPerson reached
I20151022-07:22:49.881(-7)? Exception while invoking method 'insertPerson' Refer
enceError: alert is not defined
I20151022-07:22:49.881(-7)?     at [object Object].Meteor.methods.insertPerson (
both/methods.js:15:9)
I20151022-07:22:49.882(-7)?     at maybeAuditArgumentChecks (livedata_server.js:
1692:12)
I20151022-07:22:49.882(-7)?     at livedata_server.js:708:19
I20151022-07:22:49.882(-7)?     at [object Object]._.extend.withValue (packages/
meteor/dynamics_nodejs.js:56:1)
I20151022-07:22:49.883(-7)?     at livedata_server.js:706:40
I20151022-07:22:49.883(-7)?     at [object Object]._.extend.withValue (packages/
meteor/dynamics_nodejs.js:56:1)
I20151022-07:22:49.883(-7)?     at livedata_server.js:704:46
I20151022-07:22:49.884(-7)?     at tryCallTwo (C:\Users\Clay\AppData\Local\.mete
or\packages\promise[=12=].5.0\npm\node_modules\meteor-promise\node_modules\promise\l
ib\core.js:45:5)
I20151022-07:22:49.884(-7)?     at doResolve (C:\Users\Clay\AppData\Local\.meteo
r\packages\promise[=12=].5.0\npm\node_modules\meteor-promise\node_modules\promise\li
b\core.js:171:13)
I20151022-07:22:49.885(-7)?     at new Promise (C:\Users\Clay\AppData\Local\.met
eor\packages\promise[=12=].5.0\npm\node_modules\meteor-promise\node_modules\promise\
lib\core.js:65:3)

运行时引擎似乎有短期记忆丢失的坏情况 - 为什么它一开始识别 alert() ,然后几毫秒后就认不出它了?

这是被调用的方法(就在上面那个方法的下方):

,
    'getTextAddrAsEmailAddr': function(phone) {
        this.unblock();
        var restcall = 'http://www.gettextemail.com/number.lookup.php?number=' + phone;
        return Meteor.http.call("GET", restcall);
    }

可能是上面最后一个代码块有问题,但即使是这个问题,为什么它会抱怨 alert() 未定义?是不是变形了,被虚拟脑叶切除了?

更新

为了确保 alert() 没有引起问题,我将它们更改为 console.log(),现在它认为 "call" 未定义:

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);

这有什么问题吗,或者...???

这是 Meteor 的一个有趣行为,如果您在客户端和服务器端都定义了 Meteor 方法,您可以在浏览器上获得警报并在服务器上获得错误日志。

您可以通过将 Meteor 方法放在 /server 文件夹中并专门使用 console.log 来定义纯粹用于服务器端的 Meteor 方法。

或者,您可以将代码包装在:

if (Meteor.isClient) {
    // code
}

并通过提醒继续你的快乐之路。

更新:

定义 Meteor 方法的地方是一个判断调用。将它留在两者上的一个巨大优势 client/server 是启用 Meteor 的延迟补偿。

参见乐观UI部分:https://www.meteor.com/tutorials/blaze/security-with-methods

同时这样做意味着您必须注意客户端和服务器都会调用您的方法这一事实。您的代码必须处理这两种情况,这意味着在一个环境中定义但在另一个环境中定义的函数(例如 alert)需要特别注意。