从构造函数内部的JSON获取构造函数参数?

时间:2015-12-06 13:33:09

标签: javascript json node.js fs

我有一个对象的构造函数。由于它的创建参数是固定的,我将它们作为数组存储在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();

节点在tests中的test.js上抛出一个未定义的错误。

我能看到的解决方案都是不切实际的:

  • 在构造函数中解析JSON。它会阻止事件循环或使构造函数异步,这两种方式都不好。
  • 从外部解析JSON,并创建一个简单的类构造函数。这将是不切实际的,因为该对象用于多个模块,其中一些本身就是对象,因此需要将JSON作为参数...

我错过了什么?这种模式是否可行,或者我应该重新开始并找到另一种解决方案?

1 个答案:

答案 0 :(得分:1)

它会抛出fs.readFile(),因为tests是异步的,因此当您尝试阅读它时,var tests = require('./tests.json'); // << make sure the path is ok console.log(tests); 尚未初始化。

你不需要手动读取你的json文件并解析它,你可以要求它,你会得到一个很好的对象:

$stmt = $mysqli->prepare('SELECT `num1`, `num2` FROM `Mytable1` WHERE `user` in (SELECT DISTINCT `user` from `Mytable1` where type=2)');
$stmt->execute();
$stmt->bind_result($num1, $num2);
$stmt->store_result();
$stmt->fetch();
$stmt->close();