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

标签 javascript

所以我刚刚听说为每个文件创建一个可导出的未命名 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/

相关文章:

javascript - ExtJS4 LinkBut​​ton 组件

javascript - 错误 : $injector:modulerr ASP. 网络核心

javascript - 除非满足条件,否则 SwiperJS 会阻止 slideNext

javascript - 无法使用 dotenv-webpack 访问 process.env 变量

javascript - HTML 包含没有 js?

javascript - jquery命令统计jpg文件个数

javascript - 显示不正确(可能是负边距)?

javascript - 丢失全局变量值

javascript - New Image()应该添加.src吗?

javascript - 使用 Vue.js 和 Firebase 进行验证