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 方法。
简介
我目前正在使用 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 方法。