当所有参数都被检查时,为什么audit-argument-checks会引发异常?

时间:2015-09-28 20:13:58

标签: 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

发生了什么事?

1 个答案:

答案 0 :(得分:3)

audit-argument-checks无法确保您check编辑了您已定义的所有参数,它确保您check编辑所有已传递的参数。< /强> 1

请考虑以下示例:

Meteor.methods({
  whale : function(foo) {
    return 'Hello ground!'
  }
})

如果从客户端调用此方法,则服务器上会发生以下情况:

Meteor.call('whale') //Nothing happens
Meteor.call('whale', 'foo') //Exception

不传递任何参数意味着如果没有写audit-argument-checks,则不会出现check的例外情况。

但是,这也意味着传递太多参数会使你的方法抛出。

Meteor.methods({
  ground : function(whale) {
    check(whale, Patterns.cetacea)
    answerTo(whale)
  }
})
Meteor.call('ground', MobyDick) //All is fine
Meteor.call('ground', MobyDick, true) //Exception

如果您遇到此问题,则意味着您的错误:客户端正在传递您不知道的参数。如果它在开发期间发生,则意味着您不知道哪些参数正在传递给您的方法,这可能是一个问题。

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

1 :见https://github.com/meteor/meteor/blob/devel/packages/ddp-server/livedata_server.js#L1686
2 :或者根据the docs编写脏的不安全代码 - check(arguments, [Match.any])