Лучшая практика 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
}`
Надеюсь, это поможет