Javascript 为什么审核参数检查会在所有参数都已检查时引发异常?

Javascript 为什么审核参数检查会在所有参数都已检查时引发异常?,javascript,meteor,Javascript,Meteor,给定以下方法定义 Meteor.methods({ myMethod : function(foo) { //Checking the only argument check(foo, String) return true } }) 该方法非常简单,但有时会失败: Meteor.call('myMethod', 'foo', 'bar') //Exception : did not check all arguments 发生了什么?审核参数检查并不能确保您

给定以下方法定义

Meteor.methods({
  myMethod : function(foo) {
    //Checking the only argument
    check(foo, String)
    return true
  }
})
该方法非常简单,但有时会失败:

Meteor.call('myMethod', 'foo', 'bar') //Exception : did not check all arguments

发生了什么?

审核参数检查
并不能确保您已检查了所有已定义的参数,而是确保您已检查了所有已传递的参数。1

考虑以下示例:

Meteor.methods({
  whale : function(foo) {
    return 'Hello ground!'
  }
})
如果从客户端调用此方法,则服务器上会发生以下情况:

Meteor.call('whale') //Nothing happens
Meteor.call('whale', 'foo') //Exception
不传递任何参数意味着,如果未写入
检查
,则不会出现
审核参数检查
的异常


然而,这也意味着传递太多的参数会使方法抛出

Meteor.methods({
  ground : function(whale) {
    check(whale, Patterns.cetacea)
    answerTo(whale)
  }
})
如果你对此有异议,这意味着你做错了事情:客户在传递你不知道的论点。如果它发生在开发过程中,这意味着您不知道哪些参数正在传递给您的方法,这可能是一个问题

安装的软件包使用的方法的参数可能比预期的多。请参阅他们各自的文档,以确切了解传递了哪些参数(或者只需编写
console.log(arguments)
),以便确保编写正确的安全代码。2


1:见
2:或者只写脏的不安全代码-
检查(参数,[Match.any])
根据

Meteor.call('ground', MobyDick) //All is fine
Meteor.call('ground', MobyDick, true) //Exception