gpt4 book ai didi

javascript - 管理可导出 API 的最佳实践

转载 作者:行者123 更新时间:2023-11-28 03:11:20 26 4
gpt4 key购买 nike

所以我刚刚听说为每个文件创建一个可导出的未命名 API 方法是一种更好的做法,而不是在一个文件下收集所有可导出的命名 API 方法。

就像API文件夹内的fileA.js一样

/* The only method inside fileA */

export default async function(){
/* Some actions here to fetch or post data */
}

在 API 文件夹内的 fileB.js 中

/* The only method inside fileB */

export default async function(){
/* Some actions here to fetch or post data */
}

而不是将所有方法收集在一个文件 Api.js 下

/* Placing all exportable APIs under one file */

export default async function thisAction(){
/* Some actions here to fetch or post data */
}

export default async function thatAction(){
/* Some actions here to fetch or post data */
}

谁能告诉我这两种做法的优缺点。就包大小和文件管理而言,为每个 API 创建一个文件可能听起来很糟糕……但我在这里可能是错的。

最佳答案

最正确的答案是:这取决于情况。通常,对于 API,您想要做的是让每个文件导出与其用途相关的函数/对象。即保留 single responsibility principle在设计类和函数时要牢记这一点。这样做时,您经常会看到更多的代码分离,例如在自己的文件中导出单个函数或类。

例如:node.js 服务模块

const crypto = require('crypto');

/**
* @description Generates a random salt value with a default of 256 char buffer.
* @param {Number} size integar value for salt size
*/
function createSalt(size = 256) {
const salt = crypto.randomBytes(size).toString('hex');
return salt;
}

/**
* @description Hashes a given string with a provided salt value.
* @param {String} str String to be hashed.
* @param {Number} salt The provided salt value.
*/
function hashString(str, salt) {
const hashedStr = crypto.pbkdf2Sync(str, salt, 1000, 512, 'sha512').toString('hex');
return hashedStr;
}

module.exports = { createSalt, hashString };

上面是一个简单的 Node.js 文件,它使用 Crypto 包处理字符串加盐和哈希处理。该模块的唯一目的是能够对字符串进行加盐/散列,这使得最好将这两个函数放在同一个文件中。由于您正在处理 API,因此很多时候您会希望从文件中进行一次导出。例如, Controller 类、中间件、服务等可能只需要导出一个对象,这使得每个对象一个文件是理想的。

例如: typescript 节点 Controller

import { Response, Request } from "express";
import UserData from "../data/Users/UserData";
import AccountData, { IDetails } from "../data/Account/AccountData";
import UserSchema, { IUserModel } from "../models/UserModel";
import ILoginResult from "../data/Users/ILoginResult";

class UserController {
public async addUser(req: Request, res: Response) {
let newUser: IUserModel = new UserSchema(req.body);
let result: ILoginResult = await UserData.createNewUser(newUser);
res.status(result.status).send(result.result);
}

public async loginUser(req: Request, res: Response) {
const { name, password } = req.body;
let result: ILoginResult = await UserData.login(name, password);
res.status(result.status).send(result.result);
}

public async getAllUsers(req: Request, res: Response) {
try {
const payload = req["decoded"];
if (payload) {
let users: ILoginResult = await UserData.getAllUsers(payload);
res.status(users.status).send(users.result);
}
} catch (e) {
res.status(500).send({ error: e.toString() });
}
}
}

export default new UserController();

为了处理用户,您需要一个具有所需适当方法的类,并且通常是使用这些函数导出对象的单个类或模块。因此,最好的方法是在需要时使用所需的内容。您只需要一个函数或对象?然后您只需要导出该一个对象。您需要多个相关功能?导出多种功能。只坚持使用一种方法而不是另一种方法只会阻碍您的代码,并因不干净的代码和/或过多的文件而使您的代码库变得困惑。

您确实希望进行代码分离,以获得更清晰的代码库和更容易的可维护性,但您也不想将其发挥到极致。至于包的大小,除非您将大量逻辑发送到应用程序的客户端,否则您不必担心。 API 存在于服务器上,因此您不会像在 React/Vue/Angular 应用程序中那样向客户端发送 bundle 。

关于javascript - 管理可导出 API 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60089008/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com