我正在使用pdfmake在nodejs中生成PDF文件。我正在生成表格,因此对于某些列我需要发送格式化函数。
例如,如果行具有属性 employee
,其值可能类似于:
{id: 1, 名字: '约翰', 姓氏: '约翰逊'}
,
为了显示此列,我使用以下格式化函数:
员工 => `${employee.firstName} ${employee.lastName}`
因此,我将此函数作为字符串发送到我的 Nodejs 后端。在此函数上调用 toString
返回与上面相同的带引号的文本:
“员工 => `${employee.firstName} ${employee.lastName}`”
然后我使用从数据库获得的参数执行这个函数。我通过调用 eval
eval(`(${fnString})({id: 1,firstName:'测试',lastName:'测试'})`)
当函数内只有变量作为参数时,这种方法就可以正常工作。
<小时/>这就是我的问题:
假设我有这样的代码:
const prefix = 'X'
const fn = employee => `${prefix} ${employee.firstName} ${employee.lastName}`
fn.toString()
计算结果为:
“员工 => `${prefix} ${employee.firstName} ${employee.lastName}`”
但我需要它是这样的:
“员工 => `X ${employee.firstName} ${employee.lastName}`”
因为我无法访问 prefix
变量,所以我只将函数作为字符串发送到 Nodejs。
调用 toString 方法时有没有办法计算函数内部的变量?
是的,我知道,我也可以将前缀发送到nodejs,但这并不是一个很好的解决方案,有时格式化函数可能依赖于定义函数范围内的许多变量。
是的,我知道我不应该使用 eval
最佳答案
快速但肮脏的解决方案是简单地使用字符串操作并发明自己的语法:
const fn = employee => `%PREFIX% ${employee.firstName} ${employee.lastName}`
let fnString = fn.toString();
fnString = fnString.replace('%PREFIX%', prefix);
基本上,您正在发明自己的模板语言,例如 handlebars或 React 的 jsx或ejs .
就我个人而言,我感觉有更好的方法可以做到这一点,但我想不出在不彻底改变整个架构的情况下有任何快速修复方法。我想如果它对于 React/Angular 等来说足够好的话,那么对你来说应该也足够了。
关于javascript - 有没有办法在调用 toString 方法时评估函数内不是函数参数的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57766817/