我知道将缓冲区转换为json对象是非常简单的:
JSON.parse(buffer)
但是如何将包含带有函数的javascript对象的缓冲区转换为真正的javascript对象呢?
我有与函数联系的文件,我需要读取这些文件并将它们保存到另一个主对象。
虽然读取文件的任务不是问题,但我找不到任何方法将缓冲区转换回真正的javascript对象。
这是我试图加载的文件'test.js'的一个非常简单的例子
{
get:function(){return 'hello'},
somevar: "xxx",
put: function(){return 'world'}
}
在其中读取这些数据是一个缓冲区,我无法使用JSON转换,因为它包含函数,我无法使用utf8编码读取,因为它将成为字符串!
var funcs = {}
fs.readFile('test.js',function(err,buff){
funcs['test'] = buff;
})
是否可以读取文件并将其转换为真正的javascript对象?
好的,我找到了一个解决方案,但它正在使用可怕的eval(),但是这是后端代码,据我所知,没有办法让用户从前端注入任何东西,我更愿意不要使用它,但除非有任何东西可以工作而不修改文件的格式,我将使用它:
var funcs = {}
fs.readFile('test.js','utf8',function(err,buff){
eval('var_='+buff);
funcs['test'] = _;
})
答案 0 :(得分:1)
对于它的价值,您可以使用the Function
constructor。它比eval
稍微安全一些,因为它不访问本地范围。但它仍然可以访问全局变量。
var script = buffer.toString('utf8'); // assuming the file is in UTF-8
var returnObject = new Function('return ' + script);
var myObject = returnObject();
答案 1 :(得分:0)
根据您处理的代码的复杂程度,此方法可能适合您的需求,也可能不适合您:
您可以创建一个临时文件,例如" test-module.js",其中包含来自" test.js"的对象。但是使用模块导出prependend,例如:
module.exports = {
get: function() { return 'hello' },
somevar: 'xxx',
put: function() { return 'world' }
}
然后,您可以从主文件中检索已作为Javascript对象提供的文件内容:
var funcs = {}
var buff = require('./test-module');
funcs['test'] = [buff.get, buff.put];
此解决方案是否适合您?