在服务器上存储和更新JSON数据

时间:2015-07-17 09:52:53

标签: json store

我的网络应用程序应该能够在服务器上存储和更新(也加载)JSON数据。 但是,数据可能包含一些大数组,每次保存时只会附加一个新条目。

我的解决方案:

使用json数据中的密钥路径向服务器发送更新。

目前我正在通过jquery发送带有xmlhttprequest的数据,比如

/**
 * Asynchronously writes a file on the server (via PHP-script).
 * @param {String} file complete filename (path/to/file.ext)
 * @param content content that should be written. may be a js object.
 * @param {Array} updatePath (optional), json only. not the entire file is written,
 * but the given path within the object is updated. by default the path is supposed to contain an array and the
 * content is appended to it.
 * @param {String} key (optional) in combination with updatePath. if a key is provided, then the content is written
 * to a field named as this parameters content at the data located at the updatePath from the old content.
 *
 * @returns {Promise}
 */
io.write = function (file, content, updatePath, key) {
    if (utils.isObject(content)) content = JSON.stringify(content, null, "\t");
    file = io.parsePath(file);
    var data = {f: file, t: content};
    if (typeof updatePath !== "undefined") {
        if (Array.isArray(updatePath)) updatePath = updatePath.join('.');
        data.a = updatePath;
        if (typeof key !== "undefined") data.k = key;
    }
    return new Promise(function (resolve, reject) {
        $.ajax({
            type: 'POST',
            url: io.url.write,
            data: data,
            success: function (data) {
                data = data.split("\n");
                if (data[0] == "ok") resolve(data[1]);
                else reject(new Error((data[0] == "error" ? "PHP error:\n" : "") + data.slice(1).join("\n")));
            },
            cache: false,
            error: function (j, t, e) {
                reject(e);
                //throw new Error("Error writing file '" + file + "'\n" + JSON.stringify(j) + " " + e);
            }
        });
    });
};

在服务器上,php脚本管理其余部分:

  1. 收到数据并检查其是否有效
  2. 检查给定的文件路径是否可写
  3. 如果文件存在且是.json
    • 读取并解码json
    • 在无效的json上返回错误
  4. 如果没有给出更新路径
    • 只是写数据
  5. 如果有给定的更新路径
    • 如果无法遍历JSON数据中的更新路径(或文件不存在),则返回错误
  6. 在update-path
  7. 更新数据
  8. 将漂亮的json写入文件
  9. 然而,我并不是很开心,问题在最后几周仍然存在。

    我的问题

    1. 一般来说:你会如何处理这个问题?备选建议,数据库?任何可以提供帮助的图书馆? 注意:我更喜欢只使用php或一些标准apache的解决方案。
    2. 一个问题是,有时会触发同一文件上的多次写入。为了避免这种情况,我使用了Promises(包装它,因为我读了jquerys延迟的东西不是Promise / A兼容)客户端,但我不觉得100%确定它正在工作。在php中是否存在可以跨多个请求工作的(文件)锁?
    3. JSON文件时不时地破坏,我不清楚如何重现问题。在它破裂时,我没有发生的事情的历史。有这样的客户端/服务器保存/加载过程的任何常规调试策略吗?

1 个答案:

答案 0 :(得分:1)

  1. 我写了一个彗星启用Web服务器,它在json数据结构的更新上做差异。出于完全相同的原因。服务器保留一些json文档的版本,并为不同版本的json文档提供客户端,以及获取json数据的最原因版本所需的更新。
  2. 也许你可以重用我用C ++和CoffeeScript编写的一些代码:https://github.com/TorstenRobitzki/Sioux

    1. 如果您对数据结构进行了并发写访问,那么您确定,在阅读文件时,写入文件的人是否记得正确的文件版本?