在构造函数中从 JSON 获取构造函数参数?
Get constructor parameter from JSON, inside the constructor?
我有一个对象的构造函数。由于创建它的参数是固定的,我将它们作为数组存储在 JSON 文件中,并希望我可以让构造函数从该文件中获取参数。
即使读取 JSON 文件很快,我也不想这样做,并且认为我可以这样做:
//test.json:
[
{"foo": "L", "bar": 120000},
{"foo": "T", "bar": 1000},
{"foo": "D", "bar": 1000}
]
所以现在,在我的对象中,我只需要解析 JSON,并从中创建对象,我认为它会像这样简单:
//test.js
var fs = require('fs'),
tests = [];
function Test(id) {
this.foo = tests[id].foo;
this.bar = tests[id].bar;
}
function print() {
console.log(this);
}
module.exports = Test;
Test.prototype.print = print;
fs.readFile('./tests.json', function (err, data) {
if (err) {
console.log('Error reading tests.json\n' + err);
throw err;
return ;
}
tests = JSON.parse(data);
});
但是当我尝试使用它时:
var Test = require('./test.js'),
t = new Test(0);
t.print();
节点在 test.js
中的 tests
上抛出未定义的错误。
我看到的解决方案都是不切实际的:
- 解析构造函数中的JSON。它会阻塞事件循环或使构造函数异步,这两种方式都不好。
- 从外部解析 JSON,并制作一个简单的 class 构造函数。这是不切实际的,因为该对象在多个模块中使用,其中一些模块本身就是对象,因此需要将 JSON 作为参数...
我错过了什么?这种模式是否可行,还是我应该重新开始寻找其他解决方案?
它抛出 undefined error
因为 fs.readFile()
是异步的,所以当您尝试读取它时 tests
尚未初始化。
你不需要手动读取你的 json 文件并解析它,你可以要求它,你会得到一个很好的对象:
var tests = require('./tests.json'); // << make sure the path is ok
console.log(tests);
我有一个对象的构造函数。由于创建它的参数是固定的,我将它们作为数组存储在 JSON 文件中,并希望我可以让构造函数从该文件中获取参数。
即使读取 JSON 文件很快,我也不想这样做,并且认为我可以这样做:
//test.json:
[
{"foo": "L", "bar": 120000},
{"foo": "T", "bar": 1000},
{"foo": "D", "bar": 1000}
]
所以现在,在我的对象中,我只需要解析 JSON,并从中创建对象,我认为它会像这样简单:
//test.js
var fs = require('fs'),
tests = [];
function Test(id) {
this.foo = tests[id].foo;
this.bar = tests[id].bar;
}
function print() {
console.log(this);
}
module.exports = Test;
Test.prototype.print = print;
fs.readFile('./tests.json', function (err, data) {
if (err) {
console.log('Error reading tests.json\n' + err);
throw err;
return ;
}
tests = JSON.parse(data);
});
但是当我尝试使用它时:
var Test = require('./test.js'),
t = new Test(0);
t.print();
节点在 test.js
中的 tests
上抛出未定义的错误。
我看到的解决方案都是不切实际的:
- 解析构造函数中的JSON。它会阻塞事件循环或使构造函数异步,这两种方式都不好。
- 从外部解析 JSON,并制作一个简单的 class 构造函数。这是不切实际的,因为该对象在多个模块中使用,其中一些模块本身就是对象,因此需要将 JSON 作为参数...
我错过了什么?这种模式是否可行,还是我应该重新开始寻找其他解决方案?
它抛出 undefined error
因为 fs.readFile()
是异步的,所以当您尝试读取它时 tests
尚未初始化。
你不需要手动读取你的 json 文件并解析它,你可以要求它,你会得到一个很好的对象:
var tests = require('./tests.json'); // << make sure the path is ok
console.log(tests);