gpt4 book ai didi

javascript - Node 脚本中 eval() 的替代方案

转载 作者:行者123 更新时间:2023-12-01 00:28:43 25 4
gpt4 key购买 nike

我正在编写一个脚本,该脚本在 npm install 之前在 Jenkins 的构建过程中运行。我的问题是我需要从外部资源下载 JavaScript 文件并从中读取变量。

unzipper.on('extract', () => { 
const content = fs.readFileSync(`${outputDir}/js/en.js`, 'utf8');
eval(content); // Less smellier alternative?

if (obj) {
const str = JSON.stringify(obj);
fs.writeFileSync(`${outputDir}/public/data.json`, str);
} else {
throw 'Variable `obj` not found';
}
});

我知道“eval 是邪恶的”,但我在网上找到的任何建议的替代方案似乎都不起作用。我尝试了 new Function(obj)() 的不同变体,但 Node 似乎在之后退出了脚本(if-case 从未运行)。

想法?

最佳答案

因为node.js提供了API要直接与 V8 运行者交谈,使用它可能是个好主意。基本上,它是 Node 的 require 在底层使用的 API。

假设相关 js 文件包含我们感兴趣的变量 obj,我们执行以下操作:

  • 从文件中读取代码
  • 附加; obj 到代码中以确保它是它计算的最后一个表达式
  • 将代码传递给 V8 进行评估
  • 获取返回值(这是我们的obj):
    const fs = require('fs'),
vm = require('vm');

const code = fs.readFileSync('path-to-js-file', 'utf8');
const obj = vm.runInNewContext(code + ';obj');

关于javascript - Node 脚本中 eval() 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com