90-Nodejs课程2023:休息路线:恢复资源
#typescript #node #mongodb #fastify

所以,我们必须知道Restful Api概念的含义,现在让我们开始在我们的项目中实施它。

工作流程

在我们开始实施Restful Api概念之前,我们需要了解项目的工作流程,以便我们可以了解如何实施。

我们的第一步是创建一个route.resource方法,此方法将用于生成特定资源的所有路由,因此我们需要将资源名称传递给它。

此方法应该生成以下路由:

  1. GET /resource-获取所有资源
  2. GET /resource/:id-获取特定资源
  3. POST /resource-创建一个新资源
  4. PUT /resource/:id-更新特定资源
  5. DELETE /resource/:id-删除特定资源
  6. PATCH /resource/:id-更新特定资源

第二个参数是资源对象,该对象应具有某些方法,每个方法代表特定路由的处理程序,因此我们需要将每个路由的处理程序传递给资源对象。

例如:


const resource = {
  list: listUsers,
  get: getSingleUser,
  create: createUser,
  update: updateUser,
  delete: deleteUser,
  patch: patchUser,
};

因此,根据资源所包含的内容,我们将相应地添加路线。

另一个好的功能是,我们也可以通过这些路线来传递路由选项,就像单一路线调用一样。

我们还将使用路由名称功能来命名路线,因此我们将来可以使用它们。

足够的交谈现在让我们转到代码。

执行

首先,让我们定义我们的Resource Type

// src/core/router/types.ts

/** Route resource */
export type RouteResource = {
  /**
   * list route
   */
  list?: RouteHandler;
  /**
   * Single resource route
   */
  get?: RouteHandler;
  /**
   * Create resource route
   */
  create?: RouteHandler;
  /**
   * Update resource route
   */
  update?: RouteHandler;
  /**
   * Patch resource route
   */
  patch?: RouteHandler;
  /**
   * Delete resource route
   */
  delete?: RouteHandler;
};

因此,我们只是定义了一种用于定义资源对象的类型,它包含所有将用于处理路线的方法,处理程序与单一路由处理程序相同,因此在这里没有什么新的。

资源方法

现在,让我们定义我们的resource方法,此方法将接收三个参数,第一个参数是资源路径,第二个是资源对象,第三个是路由选项。

我们还需要设置资源名称,如果未在选项中传递资源名称,让我们来看看。

// src/core/router/index.ts
import { ltrim, merge, toCamelCase } from "@mongez/reinforcements";
// ...
  /**
   * Add full restful resource routes
   * This method will generate the following routes:
   * 1. GET /path: list all resources
   * 2. GET /path/:id: get a single resource
   * 3. POST /path: create a new resource
   * 4. PUT /path/:id: update a resource
   * 5. DELETE /path/:id: delete a resource
   * 6. PATCH /path/:id: update a resource partially
   */
  public resource(
    path: string,
    resource: RouteResource,
    options: RouteOptions = {},
  ) {
    // get base resource name
    const baseResourceName = options.name || toCamelCase(ltrim(path, "/"));

    if (resource.list) {
      const resourceName = baseResourceName + ".list";
      this.get(path, resource.list, { ...options, name: resourceName });
    }

    if (resource.get) {
      const resourceName = baseResourceName + ".get";

      this.get(path + "/:id", resource.get, { ...options, name: resourceName });
    }

    if (resource.create) {
      const resourceName = baseResourceName + ".create";

      this.post(path, resource.create, { ...options, name: resourceName });
    }

    if (resource.update) {
      const resourceName = baseResourceName + ".update";

      this.put(path + "/:id", resource.update, {
        ...options,
        name: resourceName,
      });
    }

    if (resource.patch) {
      const resourceName = baseResourceName + ".patch";

      this.patch(path + "/:id", resource.patch, {
        ...options,
        name: resourceName,
      });
    }

    if (resource.delete) {
      const resourceName = baseResourceName + ".delete";

      this.delete(path + "/:id", resource.delete, {
        ...options,
        name: resourceName,
      });
    }

    return this;
  }

这里没什么难的,首先我得到了baseResourceName,您可以在选项列表中传递,否则将从路径中获取。

const baseResourceName = options.name || toCamelCase(ltrim(path, "/"));

toCamelCase用于将路径转换为骆驼盒,例如,users-groups将转换为usersGroups

我使用ltrim从路径上删除/,因此,如果路径为/users,它将为users

然后,我们检查了每个路由类型,我们从list开始,如果存在,如果我们将添加路线,我们使用baseResourceName并将.list添加到它,因此路由名称将为users.list,然后我们添加了它作为通往路由器系统的路线。

及其其余路线也适用。

用法

现在让我们看看如何使用它。

// src/app/users/routes.ts
import router from "core/router";
import login from "./controllers/auth/login";
import listUsers from './controllers/users/list';
import getUser from './controllers/users/get';
import createUser from './controllers/users/create';
import updateUser from './controllers/users/update';
import patchUser from './controllers/users/patch';

const restfulUser = {
    list: listUsers,
    get: getUser,
    create: createUser,
    update: updateUser,
    patch: patchUser,
};

router.resource("/users", restfulUser);

router.post("/login", login);

就是这样!,现在您可以使用应用程序中的资源路由。

- 结论

在本文中,我们学会了如何创建资源路线以及如何在我们的应用程序中使用它。

在下一篇文章中,我们将看到如何创建我们的第一个休息班,该课程在一个地方!,请继续关注。

â•给我买一杯咖啡。

如果您喜欢我的文章并看到对您有用,则可以buy me a coffee,它将帮助我继续前进并继续创建更多内容。

ð项目存储库

您可以在Github

上找到此项目的最新更新

ð加入我们的社区

Discord上加入我们的社区以获得帮助和支持(Node JS 2023频道)。

ð视频课程(阿拉伯语)

如果您想以视频格式学习此课程,则可以在Youtube上找到该课程,该课程是阿拉伯语。

ð奖励内容ð

您可能会看这些文章,这肯定会提高您的知识和生产力。

一般主题

软件包和库

React JS软件包

课程(文章)