我正在调试公司过去的一位工人编写的代码,以进行外观更新,并且听不懂。
当对象是我的输入时,代码使用new Function(object)
将字符串编译为函数。
我正在尝试在输入中读取一个文件,像这样-require("fs").readFileSync("myfile.txt")
,但是该函数引发了require is not defined
的异常。
如何在新功能中访问require
,否则如何在new Function
中以其他方式读取文件内容?
谢谢
答案 0 :(得分:1)
如果出于任何原因需要使用new Function()
,则可以传递对fs
或其他类似内容的引用:
const fs = require('fs')
let someFn = new Function('fs', "let text = fs.readFileSync('test.txt', {encoding: 'utf8'}); console.log(text)")
someFn(fs)
您也可以以相同的方式传递require
,但这看起来更加难看。
问题在于,当您使用new Function()
创建函数时,您的函数将在Node的全局范围内运行。但是在Node中,有些名称已添加到所有模块中,这些名称可能看起来是全局的,但实际上不在全局对象上。其中包括__dirname
,__filename
和require
。结果是用new Function()
创建的函数不能直接访问它们。
这是一个简单的例子。第一个console.log
有效,但是第二个引发ReferenceError:
console.log(__dirname)
let someF = new Function("console.log(__dirname)")
someF()
有关更多信息,请参见:https://nodejs.org/api/globals.html