今天的大部分工作都是昨天工作的延续,只是在我的应用程序的路径上实现业务逻辑。因此,我想我应该在撰写此内容时休息一下,谈谈我创建的三个函数,这些函数是为了在我的应用程序中执行非常具体的事情。
这是您放置所有很难找到家的小功能的目录,但您的应用程序没有它们就无法生存。
utils 文件夹是许多应用程序中无名英雄的垃圾场。
当您必须执行数据转换而需要多行代码且必须重复使用时,最好将其放入自己的文件中,您可以将其导出到您的申请的其余部分。
为什么我们不直接复制粘贴呢?好吧,这违反了两个编程原则:DRY 和关注点分离。
重复自己不仅单调,而且如果你在整个申请过程中做得足够多,那么也很难改变。想象一个计算今天下雨的百分比的算法。
我不知道人们是如何做到这一点的,所以我无法向您展示一个例子。但是,如果您将这些内容复制到需要访问此计算的不同位置的整个代码中,那么当非常智能科学天气委员会带着新的、更准确的算法回来时,您会感到非常沮丧。 &&&]
获取代码中重复使用的部分,并找到方法将它们打包以便在多个地方使用,同时仍然在一个地方进行更新。我的 utils 文件夹中的所有函数都在我的应用程序的许多地方使用!
关注点分离
这与 utils 文件夹有什么关系?好吧,我要介绍的函数在 getRoastsById 这样的函数中并没有真正的位置,因为这不是它们所做的!当我们需要做其他事情时,我们应该为其创建一个函数。但是,当我们没有该函数的逻辑位置时,因为它是一个“助手”,我们将它放在我们的 utils 目录中!
我的 utils 文件夹
插入语句
问题: 在我的应用程序的许多不同服务中,我将需要对我的数据库执行 INSERT 查询。这些语句要求您明确列出 1) 列的名称和 2) 值。我不必在每条路线中输入这些内容,因此我创建了一个函数来为我执行此操作。
输入: 该函数采用两个参数,table 是与数据库中表名称匹配的字符串,obj 是一个 Javascript 对象,表示用户想要添加到数据库的模型。
输出: 一个对象,其中包含 1) 具有占位符值的属性格式化 INSERT 字符串和 2) 要在参数化查询中使用的值的数组。
const { snakeCase } = require('change-case-commonjs'); function insertStatement(table, obj) { const keys = Object.keys(obj); const values = Object.values(obj); let statement = `INSERT INTO ${table} (`; // Add snake_case keys to the statement const keyString = keys.map((key, i) => snakeCase(key)).join(', '); statement = `${keyString}) VALUES (`; // Add placeholders for the values const placeholders = keys.map((_, i) => `$${i 1}`).join(', '); statement = `${placeholders}) RETURNING *;`; // Return the query string and the values array return { text: statement, values: values }; } module.exports = insertStatement;更新语句
问题: 与 INSERT 语句类似,UPDATE 语句要求您在查询中明确说明列名和值。此语法与 INSERT 语句不同。通过条件逻辑,我可以创建一个databaseQueryGenerator函数,但这似乎也违反了关注点分离。像这样的函数会决定你想要什么样的查询,或者基于它生成语法吗?
输入: 该函数采用三个参数。 obj,表示更新记录的 JavaScript 对象。 table ,一个应与数据库中的表匹配的字符串。 id ,一个与要使用新信息更新的记录匹配的整数。
输出: 一个对象,具有 1) 具有占位符值的属性格式化 UPDATE 字符串和 2) 要在参数化查询中使用的值的数组。
const { snakeCase } = require('change-case-commonjs'); function insertStatement(table, obj) { const keys = Object.keys(obj); const values = Object.values(obj); let statement = `INSERT INTO ${table} (`; // Add snake_case keys to the statement const keyString = keys.map((key, i) => snakeCase(key)).join(', '); statement = `${keyString}) VALUES (`; // Add placeholders for the values const placeholders = keys.map((_, i) => `$${i 1}`).join(', '); statement = `${placeholders}) RETURNING *;`; // Return the query string and the values array return { text: statement, values: values }; } module.exports = insertStatement;对象键到骆驼
问题:我的数据库风格与我的JavaScript风格不同。然而,我不愿意在这两个方面做出妥协。在我的 JS 文件中,我的命名约定使用camelCase,而在我的数据库中它使用snake_case。返回对象的所有属性名称都相同,但格式不同。为了维持这种情况标准,我必须使用 Snake_case 访问 JS 中的属性,但我不喜欢这样。
输入: 该函数仅接受一个参数,即一个 obj JavaScript 对象,该对象的键应转换为驼峰格式。
输出: 相同的对象,具有驼峰格式的键。
const { camelCase } = require('change-case-commonjs'); function objectKeysToCamel(obj) { // Extract the keys and values const keys = Object.keys(obj); const values = Object.values(obj); let camel = {} // Change the formatting of each key, assigning it the proper value keys.forEach((key, i) => { const camelKey = camelCase(key); camel[camelKey] = values[i] }) // Return the new object return camel; } module.exports = objectKeysToCamel;
https://github.com/nmiller15/roast
前端应用程序目前部署在 Netlify 上!如果您想尝试一些功能并查看其实际效果,请在下面的移动设备上查看。
https://knowyourhomeroast.netlify.app
注意:此部署没有后端 api,因此帐户和烘焙实际上不会在会话之间的任何位置保存。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3