Node.js 如何为我的节点应用程序开发导入/导出功能

Node.js 如何为我的节点应用程序开发导入/导出功能,node.js,algorithm,import,architecture,export,Node.js,Algorithm,Import,Architecture,Export,我在Nodejs中有一个配置应用程序。它有一个名为uuid的组件。一个组件可以有许多模式。模式具有uuid、名称、组件ID和json。一个模式可以有许多配置。配置有名称、schemaId、json和uuid。模式中可以包含许多其他模式的引用。现在,我想创建一个功能,从应用程序的一个实例导出所有数据,并将其导入另一个实例。最简单的方法应该是什么?下面是几个问题 如何告诉应用程序要导出什么。目前,我认为应该为组件、模式和配置提供单独的数组。喜欢 此数据应发送到应用程序,以返回一个包含所有信息的文件,

我在Nodejs中有一个配置应用程序。它有一个名为uuid的组件。一个组件可以有许多模式。模式具有uuid、名称、组件ID和json。一个模式可以有许多配置。配置有名称、schemaId、json和uuid。模式中可以包含许多其他模式的引用。现在,我想创建一个功能,从应用程序的一个实例导出所有数据,并将其导入另一个实例。最简单的方法应该是什么?下面是几个问题

如何告诉应用程序要导出什么。目前,我认为应该为组件、模式和配置提供单独的数组。喜欢 此数据应发送到应用程序,以返回一个包含所有信息的文件,这些信息稍后将用于在另一个实例中导入

真正的问题是,我的导出文件应该是什么样子的?请记住,依赖关系也会涉及,而且依赖关系也可能重叠。例如,一个模式可以在其json字段中引用许多其他模式。例如schema1将schema2和schema4作为其依赖项。因此,还有另一个模式schema5也需要schema2。因此,在导入时,我们必须确保在保存schema1和schema5之前先保存schema2。如何表示这种需要顺序和重叠依赖项的文件,确保在导入时不会保存两次schema2。下面以schema1的json为例 导入时应遵循的分步sudo算法是什么。
这是一个完美的场合

除去组件、模式和配置术语,您拥有的是依赖于首先存在的其他对象的各种对象。拓扑排序将创建一个只有前向依赖项的顺序,假设没有循环依赖项,在这种情况下是不可能的

但复杂的是,在不同的方向上都有依赖信息。组件必须在其架构之前创建。模式必须在它所依赖的模式之后创建。这些模式可能也属于必须创建的其他组件,这并非不可能

第一步是编写一个函数,该函数接受一个对象并返回一组可从对象本身发现的依赖关系。所以我们希望dependencyRelationsobject1给出类似[[object1,object2],[object3,object1],[object1,object4]]的内容。其中object1依赖于现有的object2。注意,object1将在每对中,但可以是第一个或第二个

如果每个对象都有一个名为uniqueName的方法来唯一标识它,那么我们可以编写一个类似这样的方法抱歉,所有代码都是在这里键入的,没有经过测试,可能有语法错误,但想法是正确的:

function dependencyInfo (startingObject) {
    const nameToObject = {};
    const dependencyOf = {};
    const todo = [startingObject];
    const visited = {};

    while (0 < todo.length) {
        let obj = todo.pop();
        let objName = obj.uniqueName();
        if (! visited[ objName ]) {
            visited[ objName ] = true;
            nameToObject[objName] = obj;
            dependencyRelations(obj).forEach((pair) => {
                const [from, to] = pair;
                // It is OK to put things in todo that are visited, we just don't process again.
                todo.push(from);
                todo.push(to);
                if (! dependencyOf[from.uniqueName()]) {
                    dependencyOf[from.uniqueName()] = {}
                }
                dependencyOf[from.uniqueName()] = to.uniqueName();
            });
        }
    }
    return [nameToObject, dependencyOf];
}

现在我们有了一个对象数组,每个对象都只依赖于前面的对象。发送,然后在另一端依次对每个对象进行充气。

您能解释一下依赖性吗,尤其是在以下情况下!dependencyOf[from.uniqueName]也可以是没有依赖关系的独立对象,也可以是2 3。。。断开连接的图形,例如obj1需要obj2,obj3和obj4需要obj5。从属信息OBJ1不包括obj4、obj5。需要为dependencyInfo函数提供一整套模式,以创建一个涵盖所有对象的完整图形,以获得分类。如果bar是dependencyOf for foo中的一个键,则必须首先构建bar。if检查的原因是因为我希望它是一个散列,所以如果子散列不存在,我想创建它。JavaScript可能会也可能不会为您创建一个称为autovivification的程序,但我切换语言的次数太多,以至于我不想记住这个事实。
{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "p1": {
        "$ref": "link-to-schema2"
    },
    "p2": {
        "$ref": "link-to-schema4"
    },

}

function dependencyInfo (startingObject) {
    const nameToObject = {};
    const dependencyOf = {};
    const todo = [startingObject];
    const visited = {};

    while (0 < todo.length) {
        let obj = todo.pop();
        let objName = obj.uniqueName();
        if (! visited[ objName ]) {
            visited[ objName ] = true;
            nameToObject[objName] = obj;
            dependencyRelations(obj).forEach((pair) => {
                const [from, to] = pair;
                // It is OK to put things in todo that are visited, we just don't process again.
                todo.push(from);
                todo.push(to);
                if (! dependencyOf[from.uniqueName()]) {
                    dependencyOf[from.uniqueName()] = {}
                }
                dependencyOf[from.uniqueName()] = to.uniqueName();
            });
        }
    }
    return [nameToObject, dependencyOf];
}
function objectsInOrder (nameToObject, dependencyOf) {
    const answer = [];
    visited = {};

    // Trick for a recursive function local to my environment.
    let addObject = undefined;
    addObject = function (objName) {
        if (! visited[objName]) {
            visited[objName] = true; // Only process once.
            // Add dependencies
            Object.keys(dependencyOf[objName]).forEach(addObject);
            answer.push(nameToObject[objName]);
        }
    };
    Object.keys(dependencyOf).forEach(addObject);
    return answer;
}