如何解析和加载javascript对象?

时间:2014-11-24 15:01:12

标签: javascript node.js

我有一个js文件。我使用eval()函数使用其他javascrupt文件加载它。我看到eval很慢,还有一些其他的限制。因为我需要将我的JS文件对象存储在缓存中,并在apllication启动后随时使用它。我不想每次都做eval()。

无论如何都要以简单的方式去做。

var evalObj;
if(evalObj) {
                console.log('eval object already evaluated');
                _myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level, categoryName, message);
            }
            else {

                evalObj = eval(fs.readFileSync('./myJSFile', 'utf8'));

                console.log('re evaluating  object ..' );
                _myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level,message);
            }

myJSFile

 var _sigmaAlarmHandler_ =function(args)
{
    var args = Array.prototype.slice.call(arguments);
    args.unshift();    
        console.log('Alarm : ', args);   
}

条件评估不起作用。

3 个答案:

答案 0 :(得分:0)

node.js中你可以简单地要求你的js文件:

var obj = require('./myJSFile');
obj.foo();

./myJSFile.js

exports.foo = function() {
  console.log('foo');
}

此文件将成为您需要导出功能的模块 它加载一次,然后每个require重用已经加载的模块。

答案 1 :(得分:0)

如果它不符合commonjs(即使用module.exports将无效),那么您可以在自己的vm中运行它:

var vm = require('vm');
vm.runInNewContext(jscode,{/*globalvars*/});

其中第二个参数是一个对象,其中全局变量在运行jscode的上下文中可用。因此,如果第二个参数是{a:1,b:"foo"},则您的jscode将运行,全局变量a设置为1,全局变量b设置为"foo" }。

jscode本身是一个从文件或其他地方加载的字符串。

vm.runInNewContext()视为“练习安全评估”。嗯,相对安全,如果你传递特定的变量,你仍然可以做一些危险的事情,比如processfile等。

我将此用作node_s

的cansecurity http://github.com/deitch/cansecurity的声明部分

您可以在文件lib/declarative.js

中查看示例

以下是vm http://nodejs.org/api/vm.html

的API

可以选择在相同的环境中运行,等等。但这是非常危险的。

当您实际运行代码时,请使用上面的示例:

_myfunctionInJSFile_(layouts.FormatDate(startTime), threadName, level,message);

您希望传递4个参数:startTimethreadNamelevelmessage并执行该功能。问题是您无法在当前上下文中运行该功能。您需要在文件中定义定义的函数。所以你应该有类似的东西:

vm.runInNewContext(jscode,{startTime:layouts.FormatDate(startTime),threadName:threadName,level:level,message:message});

然后jscode应该看起来像

function _myfunctionInJSFile(startTime,threadName,level,message) {
  // do whatever you need to do
}
// EXECUTE IT - the above vars are set by the global context provide in vm.runInNewContext
_myfunctionInJSFile(startTime,threadName,level,message);

如果您希望定义该函数并将其加载并在上下文中运行,那么只需使用commonjs格式。

答案 2 :(得分:0)

我想我找到了答案。

由于我的应用程序在使用v8引擎平台的节点js中运行。当应用程序启动 v8引擎缓存时,所有代码/配置都可以随时使用。 同样在我的代码中,我将使用eval预加载JS代码,我将只执行一次。所以在下一次调用时,我将只返回加载的JS代码。在这里,我需要修改代码加载一次。 但我们看到的主要观点是,将来如果任何机构有类似的要求,他们可以使用eval缓存他们的JS代码(感谢v8引擎)并使用它直到你的应用程序运行。