我有一个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);
答案 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 };