Javascript重写配置文件

Javascript Rewrite Config File

本文关键字:配置文件 重写 Javascript      更新时间:2023-09-26

我有一个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');

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

编辑不要阅读上面的解决方案,它在错误的地方,因此不是一个有效的答案。你已经被警告了。

您可以使用一个非常流行的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!');
});