Лучшая практика Node.js для заполнения JSON-запроса

вступление

В настоящее время я использую UPS Rate API для создания плагина доставки для клиента, чтобы получить оценку стоимости доставки для клиентов во время оформления заказа (среди прочего).

Я кратко использовал Nodejs в прошлом, однако я впервые использую его в производственной среде и хочу убедиться, что я использую лучшие практики для этого приложения.

Код

Ниже приведен запрос, который я должен отправить в конечную точку API UPS, чтобы получить оценку доставки:

{
   "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)

Мой инстинкт состоит в том, что с вышеприведенным кодом многое не так, например, когда каждая функция изменяет ссылочный объект, а не возвращает новый объект с заполненным содержимым; использование функций глобальными переменными для заполнения информации; и в целом, это кажется большим количеством кода для простой задачи.

Приложение примет запрос POST с информацией в виде const в этом примере, затем верните результаты оценки доставки.

Должен ли я создавать словарь для каждого поля, передавать json и содержимое словаря, и иметь функцию поиска элементов словаря, заполнения json и возврата результатов?

2 ответа

Решение

Не забывайте об этом ненужными парадигмами программирования. Согласно вашему комментарию, это простое создание объекта, структура которого никогда не меняется. Относитесь к этому как таковой.

Если ваша задача - создать объект 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.

Первое, что нужно использовать, это использовать объектные литералы вместо того, чтобы загрязнять глобальное пространство имен.

`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. Использование современных методов программирования означало бы использование уровня абстракции и инкапсуляции, помимо прочего, похоже, что вы пишете в реализацию вместо того, чтобы писать повторно используемый код, выполняющий задачу. Наилучший способ написания кода - это работа с любым объектом, что предполагает использование методов функционального программирования, когда функция не заботится о состоянии своих аргументов. пример

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

Надеюсь, это поможет

Другие вопросы по тегам