【问题标题】:Best practice creating a key/value map dev/prod node.js创建键/值映射的最佳实践 dev/prod node.js
【发布时间】:2016-03-03 12:22:44
【问题描述】:

我有一个 Node.js 应用程序 APP-A,它使用 APP-B 的 API 与另一个 C# 应用程序 APP-B 通信。 APP-B 有一个返回 JSON 的 RESTful API。除了一些标准字段,例如名称、描述之外,APP-B 的键是在用户在系统中创建字段时定义的。生成的 JSON 如下所示:

{
  "name": "An example name",
  "description": "Description for the example",
  "cust_fields": {
    "cust_123": "Joe Bloggs",
    "cust_124": "Essex"
  }
}

我有两个 APP-B 实例,一个开发环境和一个生产环境,它们是分开安装的。结果prod环境的JSON如上,dev环境的JSON是这样的:

{
  "name": "An example name",
  "description": "Description for the example",
  "cust_fields": {
    "cust_782": "Joe Bloggs",
    "cust_793": "Essex"
  }
}

这在 APP-A(Node.js 应用程序)中通过这样的 JSON 映射来处理:

{
  "name": "name",
  "description": "description",
  "cust_fields": {
    "full_name": "cust_123",
    "city": "cust_124"
  }
}

加载如下:

var map;
switch(env) {
  case 'dev':
    map = require('../env/dev/map.json');
    break;
  case 'prod':
    map = require('../env/prod/map.json');
    break;
};

module.exports = {
  name: map.name,
  description: map.description,
  cust_fields: {
    full_name: map.cust_fields.full_name,
    city: map.cust_fields.city,
  }
}

所以我想知道,有没有更好的方法来处理这个问题?我看不到必须在 prod 和 dev 的键名之间创建某种手动关系的方法,因为没有办法找出哪个字段对应于什么,但这似乎需要做很多工作。

感谢阅读。

更新:

我创建了一个 jsFiddle 来更好地说明我的问题:http://jsfiddle.net/7k9k03o6

【问题讨论】:

  • 我同意,手动维护这不是一个长期的解决方案。所以每个用户都有一个特定于他们的自定义字段名称?而且您正在尝试将它们映射到服务器上的同一字段?如果它们真的不是唯一的,也许只是使用枚举来生成字段,这样他们就可以从列表中选择自定义字段?或者如果它们始终相同,只需为每个用户定义字段,如果他们不选择填充它们,某些字段将是空的?对您正在尝试做的事情进行更多解释会很好 - 也许它是一个比现在设置的更简单的用例。
  • 我创建了一个 jsFiddle 来更好地说明我的问题:jsfiddle.net/7k9k03o6。我想重点是在两个环境中处理更改键。
  • 为什么不同的环境使用不同的字段名?这似乎很让人头疼 - 你这样做的原因是什么?
  • 更改字段名称的系统不是我能控制的。它是一个表单和工作流系统,允许用户构建自己的表单并添加自己的字段。当用户在他们的系统 APP-B 中添加一个新字段并希望它出现在 Node.js 系统 APP-A 中时,这就是用于执行此操作的方法。是的,这是一个巨大的头痛 - 因此我的问题。必须有更好的方法。

标签: javascript node.js


【解决方案1】:

如果映射是不可避免的并且现在一切都是手动完成的,那么下一个最佳进展是通过一些持久性存储(即数据库)自动构建这些查找映射。

一般流程是:

  1. 当 APP-B 创建新表单时,该字段信息与所有识别信息一起存储在数据库中。您可以将生产和开发数据存储在同一个数据库中(作为标志),但它们可能只是不同的数据库。结构可能类似于customerId, formId, fieldName, fieldMapping, fieldValue, isProduction --> 123, 2, 'cust_124', 'city', 'Essex', true
  2. 当 APP-A 需要一个字段列表时,它会在数据库中查询相关字段列表。“在生产中为表单 Y 查找映射客户 X”--> WHERE custId = 123 AND formId = 2 AND isProduction = true 将生成字段列表及其映射值 (您可以将处理/减少到您需要的映射中)。

此自动化过程将减少您手动完成的工作。您不应意外错过或忘记手动生成的文件中的映射。

这将为服务器处理增加一点工作量,因为每次处理请求时都需要从数据库中映射字段。 (每次加载客户时,您可以稍微退后一点并进行一次大查询,或者每次服务器启动时再退一步......取决于这些自定义字段的动态程度)。另外,您必须将数据库结果映射到一个可用的列表中以供您使用。

根据您监控的客户数量和自定义表单的数量,自动化流程将为您节省大量时间,并避免手工生成的所有错误。

【讨论】:

    猜你喜欢
    • 2021-10-08
    • 2022-07-04
    • 2021-07-24
    • 2023-03-16
    • 1970-01-01
    • 2019-11-19
    • 2020-04-19
    • 1970-01-01
    • 2015-04-23
    相关资源
    最近更新 更多