读取一个在Node.JS中有对象的JS文件

时间:2014-07-29 22:36:28

标签: javascript node.js express

我有一个JS文件,因为我有很多对象;我想在Node.Js中读取此文件并循环访问对象。 JS文件看起来像:

User = {
    fields: {
        name: {
            type: "STRING"
        },
        id: {
            type: "integer"
        },
        password: {
            type: "STRING"
        }
    }
};

car = {
    fields: {
        model: {
            type: "STRING"
        },
        color: {
            type: "STRING"
        }

    }
};

我尝试了以下但不起作用:

var Model = fs.readFileSync("Model.js");
data_test = JSON.stringify(Model);
response.send(data_test);

2 个答案:

答案 0 :(得分:0)

显然,该文件是JS而不是JSON,因此JSON.stringify无效。如果您完全无法控制该文件,那么您可以从技术上使其与某些黑客一起使用

function requireFromString(src, filename) {
    var Module = module.constructor;
    var m = new Module();
    m._compile(src, filename);
    return m.exports;
}
var moduleStr = fs.readFileSync("Model.js");
moduleStr = 'module.exports = {' + moduleStr + '}';
response.send(requireFromString(moduleStr));

this answer借来的即时模块编译代码示例 stolen


上述示例背后的想法是尝试将Model.js导出为单个对象,因为我假设您不知道驻留在哪个类型的对象。然而,回头看,我可以看到它不会起作用,因为

module.exports = { 
     User = { ... };
     car = { ... };
}

JS无效。如果你知道要导出哪些对象,那么你当然可以修改moduleStr来做那个

moduleStr = moduleStr + '\nmodule.exports = { User: User, Car: car }';

答案 1 :(得分:0)

  

此外,您的方法给了我以下错误:“SyntaxError:UVpected token = at Module._compile(module.js:439:25)at requireFromString”

对@James的回答稍作调整应该可以解决问题:

function requireFromString(src, filename) {
    var Module = module.constructor;
    var m = new Module();
    m._compile(src, filename);
    return m.exports;
}
var moduleStr = fs.readFileSync("Model.js");
//moduleStr = 'module.exports = {' + moduleStr + '}';
moduleStr = moduleStr + '\nmodule.exports = { User: User, car: car };';
response.send(requireFromString(moduleStr));

说明:

正如其他人评论的那样,有效的JSON !==有效的Javascript; 如果文件在浏览器中加载,则表示它是有效的Javascript, 但不一定是有效的JSON。

基本上你要做的是在NodeJs中加载一个Javascript文件。 不幸的是,NodeJs在加载不同文件和管理它们之间的依赖关系时使用不同的系统。 在浏览器中,它基于先到先得的原则。 基本上,变量是按照加载文件的顺序创建的。

在NodeJs OTOH中,您指定qa单个Javascript文件作为入口点, 并且该文件应该'require()'它需要的任何其他Javascript文件。 无论每个文件exports是什么require - 文件都可以看到。

tl; dr浏览器和NodeJ以不兼容的方式加载Javascript文件。

那么,你如何解决问题呢? James的解决方案提供了一种编译NodeJs模块的方法 通过编译字符串手动。

这很好,除了修改字符串以导出文件中的内容 根本不会产生有效的Javascript:

module.exports = { foo = 'bar'; }

我的解决方案是做什么的,这产生了有效的Javascript:

foo = 'bar';
module.exports = { foo: foo };