0

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

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

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更像是一个数组。有没有办法将参数作为对象获取,或者将参数名称作为数组获取?我会以这种错误的方式进行吗?

在不重复自己的情况下验证一堆论点的好方法是什么?

4

2 回答 2

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我会假设您在网络环境中?为什么不简单地使用您正在使用的框架正在处理的参数哈希?大多数框架都会这样做。

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

handleRequest = (x, y = "somevalue", z = "anothervalue")->
于 2013-07-05T12:31:14.203 回答
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'
于 2013-07-04T21:49:01.893 回答