在CoffeeScript中验证参数?

时间:2013-07-04 21:10:55

标签: coffeescript

我有一个带有一堆参数的函数,我只想检查它们中是否有任何伪造(空,未定义,null等)。

一个选项显然是单独检查每个参数,但它非常重复:

if not arg1
  response.send 400, 'Missing argument arg1'
if not arg2
  response.send 400, 'Missing argument arg2'

我可以用这个简化一下,但我仍然要列出每个参数和参数名称:

for key, value of { 'arg1': arg1, 'arg2': arg2 }
  if not value
    response.send 400, "Missing argument #{key}"

我希望能做到这样的事情:

for key, value of arguments
  if not value
    response.send 400, "Missing argument #{key}"

但是arguments更像是一个数组。有没有办法将参数作为对象获取,或者将参数名称作为数组?我这样做错了吗?

在不重复自我的情况下验证一堆参数的好方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以编写一个检查函数,从函数的字符串表示中解析参数名称(实际上没有其他方法)

check = ()->
    f = "" + arguments.callee.caller
    r = /function \((.*)\)/
    regres = r.exec(f)
    pnames = regres[1].split(",")
    params = (pn.trim() for pn in pnames)
    for index in [0...arguments.length]
        if arguments[index] == null || arguments[index] == undefined
            console.log "argument: #{params[index]} is null"

handleRequest = (x, y, z)->
    #give all your params in the correct order to the check function
    check(x, y, z)

handleRequest(1, 2, "lala")
handleRequest(1, 2)

现在事实上,这在某种程度上可能并不意味着你应该这样做。这个解决方案最好是脆弱的,如果你改变参数位置会造成混乱。有些人可能会声称它的邪恶 - 包括我; - )

我建议您更改API设计。

response.send 我会假设您处于网络环境中?为什么不简单地使用你正在使用的框架处理的params散列?大多数框架都会这样做。

另一种可能性是为您的参数定义默认值,以便始终明确定义收到的参数?

handleRequest = (x, y = "somevalue", z = "anothervalue")->

答案 1 :(得分:1)

我认为没有明确的方法来实现你想要的东西,但这是一种令人讨厌的方式(基于javascript的类似线程,如thisthis),这可能容易出错,是解析函数本身,获取参数的名称并使它们成为一个数组:

fn = (a,b,c,d,e,f) ->
  fns = fn.toString()
  args = fns.slice(fns.indexOf('(')+1, fns.indexOf(')')).split(', ')
  for idx in [0...args.length]
    console.log 400, "Missing argument #{args[idx]}" unless arguments[idx]

fn('', null, 'arg1', undefined, 'arg2')

#Output:
#400 'Missing argument a'
#400 'Missing argument b'
#400 'Missing argument d'
#400 'Missing argument f'