在新功能内要求

时间:2018-07-04 00:38:34

标签: javascript node.js

我正在调试公司过去的一位工人编写的代码,以进行外观更新,并且听不懂。

当对象是我的输入时,代码使用new Function(object)将字符串编译为函数。 我正在尝试在输入中读取一个文件,像这样-require("fs").readFileSync("myfile.txt"),但是该函数引发了require is not defined的异常。

如何在新功能中访问require,否则如何在new Function中以其他方式读取文件内容?

谢谢

1 个答案:

答案 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__filenamerequire。结果是用new Function()创建的函数不能直接访问它们。

这是一个简单的例子。第一个console.log有效,但是第二个引发ReferenceError:

console.log(__dirname)
let someF = new Function("console.log(__dirname)")
someF()

有关更多信息,请参见:https://nodejs.org/api/globals.html