Node.js 填充 JSON 请求的最佳实践

Node.js best practice to populate JSON request

简介

我目前正在使用 UPS 费率 API 为客户创建运输插件,以便在结账时估算客户的运费(以及其他事项)。

我过去曾短暂地使用过 Nodejs,但这是我第一次在生产环境中使用它,我想确保我使用的是此应用程序的最佳实践。

代码

以下是我必须发送到 UPS 的 API 端点以获取运费估算的请求:

{
   "UPSSecurity":{
      "UsernameToken":{
         "Username":"Your User Id",
         "Password":"Your Password"
      },
      "ServiceAccessToken":{
         "AccessLicenseNumber":"Your Access License"
      }
   },
   "RateRequest":{
      "Request":{
         "RequestOption":"Rate",
         "TransactionReference":{
            "CustomerContext":"Your Customer Context"
         }
      },
      "Shipment":{
         "Shipper":{
            "Name":"Shipper Name",
            "ShipperNumber":"Shipper Number",
            "Address":{
               "AddressLine":[
                  "Address Line ",
                  "Address Line ",
                  "Address Line "
               ],
               "City":"City",
               "StateProvinceCode":"State Province Code",
               "PostalCode":"Postal Code",
               "CountryCode":"US"
            }
         },
         "ShipTo":{
            "Name":"Ship To Name",
            "Address":{
               "AddressLine":[
                  "Address Line ",
                  "Address Line ",
                  "Address Line "
               ],
               "City":"City",
               "StateProvinceCode":"State Province Code",
               "PostalCode":"Postal Code",
               "CountryCode":"US"
            }
         },
         "ShipFrom":{
            "Name":"Ship From Name",
            "Address":{
               "AddressLine":[
                  "Address Line ",
                  "Address Line ",
                  "Address Line "
               ],
               "City":"City",
               "StateProvinceCode":"State Province Code",
               "PostalCode":"Postal Code",
               "CountryCode":"US"
            }
         },
         "Service":{
            "Code":"03",
            "Description":"Service Code Description"
         },
         "Package":{
            "PackagingType":{
               "Code":"02",
               "Description":"Rate"
            },
            "Dimensions":{
               "UnitOfMeasurement":{
                  "Code":"IN",
                  "Description":"inches"
               },
               "Length":"5",
               "Width":"4",
               "Height":"3"
            },
            "PackageWeight":{
               "UnitOfMeasurement":{
                  "Code":"Lbs",
                  "Description":"pounds"
               },
               "Weight":"1"
            }
         },
         "ShipmentRatingOptions":{
            "NegotiatedRatesIndicator":""
         }
      }
   }
}

看到要填写的字段数量,解决这个问题的最佳方法是什么,同时坚持低耦合和高内聚的基本软件工程原则?

我是否应该针对每个字段部分执行类似于下面的代码示例的操作?

const shipToAddr1 = "A street with number"
const shipToAddr2 = "Line 2 with number"
const shipToAddr3 = "The third line"
const shipToCity = "Boston"
const shipToStateProvinceCode = "12"
const shipToPostalCode = "01970"
const shipToCountryCode = "US"
const shipToName = "Bob Wallace"

const packageLength = "10"
const packageWidth = "5"
const packageHeight = "18"
const PackageWeight = "12"

//See above code snippet
var jsonRequest = {...}

function writeShipToContents(json, shipToName, shipToAddr1, shipToAddr2, 
    shipToAddr3){

    json.RateRequest.Shipment.ShipTo.Name = shipToName
    json.RateRequest.Shipment.ShipTo.Address.AddressLine = [
        shipToAddr1,
        shipToAddr2,
        shipToAddr3
        ]

}

function writeShipFromContents(json){
   ...
}

function writePackageDetails(json){
   ...
}


function writeShipmentRequest(json){

   writeShipToContents(json)
   writeShipFromContents(json)
   writePackageDetails(json)

   ...

   return json

}

writeShipmentRequest(jsonRequest)

我的直觉是上面的代码有很多问题,例如让每个函数更改引用的对象而不是 return 使用填充的内容创建一个新对象;让函数使用全局变量来填充信息;总而言之,这似乎是一个简单任务的大量代码。

应用程序将接受一个 POST 请求,其中包含示例中的 const 信息,然后 return 运费估算结果。

我是否应该为每个字段创建一个字典,传递 json 和字典内容,并让函数查找字典项目,填充 json 和 return结果?

首先要使用最佳实践的是使用对象字面量而不是污染全局命名空间

`const anyObject = {
// your object
}`

第二件事是使用函数式编程技术

`function( anyObject, argsToDo) {
// do what every you want to anyObject with other functions
// anyObject could contain all the properties you need to write
// () => setWhatever(anyObject) 
// or return new anyObjectWithArgsToDo();
}` 

您可以使用该方法为您需要提交的 JSON 对象动态编写字段示例伪代码:

`function writeFields( anyObject, fieldsObject ) {
let i = 0;
foreach( anyObject as value ) {
value = fieldsObject[I];
i++;
}`

你可以组合对象来保存其他对象 JSON 代表 JavaScript 对象表示法所以你可以将它们作为参数传递给函数,用函数对它们执行操作,用对象创建新对象作为论点等。等等。这是关于函数式编程 https://en.wikipedia.org/wiki/Functional_programming 的 Wiki link。使用现代编程技术就是使用抽象层和封装层,看起来好像您正在编写实现而不是编写执行任务的可重用代码。编写代码的最佳方式是使其适用于任何对象,这涉及使用函数式编程技术,其中函数不关心其参数的状态。例子

`function writeSomeObject ( object, property, value) {
object[${property}] = ${value}; // use back ticks
// that allow dynamic use of arguments
}`

希望对你有所帮助

不要用不必要的编程范式来考虑这个问题。根据您的评论,这是一个简单的对象创建,其结构永远不会改变。就这样对待它。

如果您的任务是从值创建一个 Javascript 对象并在 POST 请求中发送它,只需创建一个 Javascript 带有缩写符号的对象:

const upsPostBody = {
    property: value
}

对整个对象执行此操作,例如(摘录):

const username = 'Your User Id';
const password = 'Your Password';
const accessLicenseNumber: 'Your Access License';

const upsPostBody = {
   UPSSecurity:{
      UsernameToken: {
         Username: username,
         Password: password
      },
      ServiceAccessToken: {
         AccessLicenseNumber: accessLicenseNumber
      }
   }
   // Continue for all other keys and values
}

将值分配给对象后,将对象作为主体传递给您的 POST 方法。