我正在使用pdfmake在nodejs中生成PDF文件。我正在生成表,因此对于某些列,我需要发送格式化功能。
例如,如果行具有属性employee
,其值可以是:
{id: 1, firstName: 'John', lastName: 'Johnson'}
,
为显示此列,我使用以下格式功能:
employee => `${employee.firstName} ${employee.lastName}`
因此,我将这个函数作为字符串发送到我的nodejs后端。在此函数上调用toString
会从上方返回带引号的相同文本:
"employee => `${employee.firstName} ${employee.lastName}`"
然后,我使用从数据库获取的参数执行此功能。我通过致电eval
eval(`(${fnString})({id: 1, firstName: 'Test', lastName: 'Test'})`)
当仅函数内部的变量为其参数时,此方法很好用。
这是我的问题:
说我有这样的代码:
const prefix = 'X'
const fn = employee => `${prefix} ${employee.firstName} ${employee.lastName}`
fn.toString()
的计算结果为:
"employee => `${prefix} ${employee.firstName} ${employee.lastName}`"
但我需要这样:
"employee => `X ${employee.firstName} ${employee.lastName}`"
因为我无权访问prefix
变量,所以我只将函数作为字符串发送给nodejs。
调用toString方法时,是否可以在函数内部求值?
是的,我知道,我也可以将前缀发送给nodejs,但这并不是一个很好的解决方案,有时格式化函数可能取决于定义函数范围内的许多变量。
是的,我知道我不应该使用eval
答案 0 :(得分:1)
快速而肮脏的解决方案是简单地使用字符串操作并发明自己的语法:
const fn = employee => `%PREFIX% ${employee.firstName} ${employee.lastName}`
let fnString = fn.toString();
fnString = fnString.replace('%PREFIX%', prefix);
基本上,您是在发明自己的模板语言,例如handlebars或React的jsx或ejs。
我个人感觉有一种更好的方法可以做到这一点,但是我不考虑任何快速修复而无需彻底检查整个体系结构。我想它对React / Angular等是否足够好。对您来说应该足够好了。