将nodejs缓冲区转换为具有函数

时间:2018-02-04 08:54:31

标签: javascript node.js

我知道将缓冲区转换为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'] = _;
})

2 个答案:

答案 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];

此解决方案是否适合您?