我有一个带有一堆参数的函数,我只想检查它们中是否有任何伪造(空,未定义,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
更像是一个数组。有没有办法将参数作为对象获取,或者将参数名称作为数组?我这样做错了吗?
在不重复自我的情况下验证一堆参数的好方法是什么?
答案 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的类似线程,如this和this),这可能容易出错,是解析函数本身,获取参数的名称并使它们成为一个数组:
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'