Coldfusion 处理CF远程函数中的无效数据类型

Coldfusion 处理CF远程函数中的无效数据类型,coldfusion,error-handling,coldfusion-10,remoteobject,Coldfusion,Error Handling,Coldfusion 10,Remoteobject,因此,我有一个远程ColdFusion函数,如: remote string function name (required numeric varname){ 这是通过AJAX调用访问的。谷歌主动将垃圾/空白值传递到这个远程函数的URL。我如何才能优雅地处理这些问题,让机器人/用户设法获得垃圾价值。我尝试过在函数中放置try/catch,但没有成功。我也尝试过设置一个默认值,但仍然得到一个错误。我希望能够返回一条错误消息 想法 现在: domain.com/path/to/page.cfc?

因此,我有一个远程ColdFusion函数,如:

remote string function name (required numeric varname){
这是通过AJAX调用访问的。谷歌主动将垃圾/空白值传递到这个远程函数的URL。我如何才能优雅地处理这些问题,让机器人/用户设法获得垃圾价值。我尝试过在函数中放置try/catch,但没有成功。我也尝试过设置一个默认值,但仍然得到一个错误。我希望能够返回一条错误消息

想法

现在:

domain.com/path/to/page.cfc?method=function&varname=
正在抛出一个错误

domain.com/path/to/page.cfc?method=function&varname=5

正在按预期工作。

更新:

我将此留给后人,因为它解释了错误的原因和验证事件链。然而,这是正确的解决方案


远程字符串函数名(必需的数字变量名){

我尝试过在函数中放置try/catch,但没有成功

因为参数值是在CF执行函数内部的任何操作之前验证的,所以它甚至从未到达
try/catch

如果要允许非数值,必须将参数类型设置为
string
,并在函数内部执行验证。即

      // use whatever check is appropriate here
      if ( IsNumeric(arguments.varname) ) { 
          // good value. do something
      }
      else {
          // bad value. do something else
      }
我也尝试过设置一个默认值,但仍然得到一个错误

domain.com/path/to/page.cfc?method=function&varname=

更新
它不起作用的原因是
varname
参数确实存在。它的值是一个空字符串。只要传递了某个值(甚至是空字符串),就会忽略
默认值。

我不同意接受的解决方案是这里的最佳方法

首先,如果你的方法期望一个数字,并且它通过了一个字符串,那么这里的错误就是正确的反应。你不应该感到有必要减轻那些传递无效值的请求。考虑到有人请求(他们应该请求)……返回404个“错误”是完全可以的。是吗?在这种情况下,错误的反应是正确的

类似地,您已经指定,对于远程调用URL,该参数应该是数字的。因此,如果它不是数字的……这是一个错误条件。因此,服务器返回500类型错误实际上是正确的做法

这是“垃圾输入,垃圾输出”规则的一个示例

如果您正在寻找一个优雅的解决方案,我认为您已经拥有了最优雅的解决方案。不要乱写特殊代码来处理错误的请求。这不是一个优雅的方法

你最好让事情出错,因为请求URL的机制会停止这样做。胡闹,让你为一个不“OK”的请求返回一个
200 OK
,是错误的做法


错误-当它们是正确的结果时-是可以的。它们没有任何问题。

我不想允许非数值。因此参数声明中的
数值
。但是如果这是唯一的方法,我可以做一个
isNumeric
检查。这似乎是次优的。没有其他方法?没有其他方法不是真的。你不能不要两全其美。使用
numeric
表示您要拒绝非数值,这正是发生的情况。您无法控制返回的错误。在其他语言中,您可能可以使用重载创建一个接受
string
并返回自定义错误消息的版本。恐怕没有办法为了在CF中做到这一点(编辑:我对CF10不是100%肯定)。虽然不是那么细粒度,但是在内部实现一个通用的try/catch如何?“catch”该特定的验证错误并输出一个自定义的错误消息。我有一个通用的错误处理程序,可以有效地处理所有错误,并且正在处理这个错误。而(我不知道它的存在)也可以,我想返回一个关于这个函数的特定错误消息。所以我想你的第一个答案就是我想要的。如果我是从一开始就设计所有这些应用程序的人,我会使用onCFCRequest并推送一个通用的
对象。error
值和我的所有请求都会寻找它。它不是currentl我同意这似乎是次优的,但我只是使用
isNumeric()
50000次循环运行了一个测试用例,每次的总处理时间(50000次运行)在0到31ms之间。(编辑-该死这5分钟的时间限制!)我同意这一点。正如我在评论中提到的,验证正在做它应该做的事情。但我的回答更侧重于解释事件链和可用选项。我遗漏了最重要的一个:如果失败,就让它去吧。没关系。无论如何,今天我的博客给了我一个主题;-)哈哈,很高兴为您服务;-)我期待着看到您的想法,所以在完成后一定要发布一个链接。然后给我猜个谜。我的服务器通过OneError功能向我发送电子邮件。这样我就可以查看代码中是否有错误并加以修复。我经常利用这个机会输入try/catch语句,以便在出现错误时提供反馈。我当机器人放入垃圾时,我会收到错误电子邮件。最好的做法是什么。删除电子邮件并将其视为工作的一部分,或者设计我的代码以便所有错误都得到反馈。几乎我们所有的错误都被OneError功能捕获,但我经常喜欢完成页面加载/请求并告诉他们出了什么问题。我的想法是与其让onError函数捕捉错误并显示半页的一般错误,不如在错误发生的地方捕捉错误并告诉用户有格式错误的数据等。对于远程函数,我似乎无法真正做到这两种方式都有,也无法简化代码。