Javascript重写配置文件

时间:2015-11-15 10:41:27

标签: javascript

我有一个config.js文件,我认为它是JSON,它在应用程序首次启动时被调用:

var config={};
config.user = [
    {id:'JSMITH', priceModify:'true'},
    {id:'JBLOGGS', priceModify:'false'},
]
config.price = [
    {id:"price01", name:"priceName01", primary:"57.25", secondary:"34.54"},
    {id:"price02", name:"priceName02", primary:"98.26", secondary:"139.45"},
    {id:"price03", name:"priceName03", primary:"13.87", secondary:"29.13"}
]

要拉/推数据,我只需使用以下内容:

// Read
var curPrice = config.price[0].primary;

// Write
config.price[0].primary = "98.24";

如何使用新值导出配置文件,以便下次打开应用程序时加载?我可以使用文件系统对象来编写文件,我只是不明白我将如何导出所有内容(最好保持相同的格式)。

我最初想过将整个配置文件读入变量,循环查找所需的块,id和键并替换值,然后将整个事情写回来,但我似乎无法想象如何仅替换该特定值。

非常感谢任何帮助

编辑道歉,我忘了提到这个应用程序完全脱机并使用本地目录

解决方案 我偶然发现了一些针对不同问题的解决方案,这些问题在结合时给了我完美的解决方案。首先,我们循环Javascript对象,构建一个细节数组,然后将数组转换为字符串:

vMethod.convertToText = function(obj) {
    var string = [];
    var output = '';
    var count= 0;
    var countTotal = 0;
    if (typeof(obj) == "object" && (obj.join == undefined)) {
        count= 0;
        countTotal = 0;
        string.push("{");
        for (prop in obj) {
            countTotal++;
        }
        for (prop in obj) {
            if(count==countTotal - 1) {
                string.push(prop, ": ", vMethod.convertToText(obj[prop]),'}\r\n');
            } else {
                string.push(prop, ": ", vMethod.convertToText(obj[prop]), ",");
            }
            count++;
        };
    } else if (typeof(obj) == "object" && !(obj.join == undefined)) {
        count= 0;
        countTotal = 0;
        string.push("[\r\n")
        for (prop in obj) {
            countTotal++;
        }
        for(prop in obj) {
            if(count==countTotal - 1) {
                string.push(vMethod.convertToText(obj[prop]),'];\r\n');
            } else {
                string.push(vMethod.convertToText(obj[prop]), ",");
            }
            count++;
        }
    } else if (typeof(obj) == "function") {
        string.push(obj.toString())
    } else {
        string.push(JSON.stringify(obj))
    }

    output = string.join("").toString();
    //output = output.slice(1, -1);     
    return output;
}

然后我们清理阵列(我需要删除多余的字符)

vMethod.cleanConfigText = function() {
    var outputText = vMethod.convertToText(config);
    outputText = outputText.slice(1, -1);
    outputText = 'var config = {};\r\n'+outputText;
    outputText = outputText.replace('user:','config.user =');
    outputText = outputText.replace(',price:','config.price =');
    outputText = outputText.slice(0, -2);
    outputText = outputText.replace(/"/g, "'")
    return outputText;
}

最后一个将对象导出到我的config.js文件中的函数:

vMethod.writeToConfig = function() {
    vObject.fileSystem = new ActiveXObject('Scripting.FileSystemObject');
    vObject.fileSystemFile = vObject.fileSystem.CreateTextFile('source\\js\\config.js',true);
    vObject.fileSystemFile.Write(vMethod.cleanConfigText());
    vObject.fileSystemFile.Close();
    delete vObject.fileSystemFile;
    delete vObject.fileSystem;
}

因此,当我想在配置中导出更改时,我只需调用:

    vMethod.writeToConfig();

文件格式的唯一区别是逗号出现在尾随行的开头而不是前一行的末尾,但我可以忍受它!

修改原来我保持了保持力并且逗号让我烦恼

将这些添加到清理功能中,现在配置与之前相同但没有缩进

    outputText = outputText.replace(/[\n\r]/g, '_');
    outputText = outputText.replace(/__,/g, ',\r\n');
    outputText = outputText.replace(/__/g, '\r\n');

感谢那些看过这个问题并试图提供帮助的人,非常感谢。

修改 不要阅读上面的解决方案,它是在错误的地方,而且不是一个有效的答案。你已经被警告了。

1 个答案:

答案 0 :(得分:0)

您可以使用非常受欢迎的npm包:https://www.npmjs.com/package/jsonfile。有很多,但我选择了这个。

通常配置内容应该是json或.env文件。

现在,您所要做的就是使用jsonfile的API来读取/写入JSON并在应用程序启动时解析它(程序包执行序列化/反序列化)。

示例:

var jsonfile = require('jsonfile');
var util = require('util');
var config = null;
var file = './config.json';

// Reading
jsonfile.readFile(file, function(err, obj) {
  config = obj;
});

// Writing

// Edit your config blah blah
config.user = [
    {id:'JSMITH', priceModify:'true'},
    {id:'JBLOGGS', priceModify:'false'},
];

config.price = [
    {id:"price01", name:"priceName01", primary:"57.25", secondary:"34.54"},
    {id:"price02", name:"priceName02", primary:"98.26", secondary:"139.45"},
    {id:"price03", name:"priceName03", primary:"13.87", secondary:"29.13"}
];

jsonfile.writeFile(file, config, function (err) {
  if(err) return err;

  console.log('Config saved to file!');
});