92-Nodejs课程2023:RESTFUL路线:列表记录
#typescript #node #mongodb #fastify

我们在上一篇文章中看到了如何实现Restful类,现在我们将实现list方法。

ð工作流程

这里的重点是我们需要定义将执行我们的数据库操作的基本模型的孩子Restful类i.e RestfulUser class,因此首先我们需要在Restful类中定义基本模型。

好,下一步呢?接下来,我们将在基类中使用该模型列出所有记录。

另外,我们可以将query对象传递到list方法,以使用request.all()方法从请求过滤记录。

由于我们已经实施了分页,我们也可以在响应中返回分页数据。

ð实施

导航到我们的Restful类并添加以下代码:

// src/core/router/restful.ts
import { Model } from "core/database";
import { Request, Response } from "core/http";
import { RouteResource } from "core/router/types";

export default class Restful implements RouteResource {
  /**
   * Base model
   */
  protected model?: Model;

  /**
   * List records
   */
  public async list(request: Request, response: Response) {
    const records = await this.model?.list(request.all()) || [];

    return response.success({
      records,
    });
  }
// ...

一旦写下了这篇文章,您就会发现Typescript编译器在向您尖叫,您无法直接从Model类中使用list方法,因此我们需要使用ChildModel类型。

但是我们没有导出模型类型文件,所以让我们先执行此操作

// core/database/model/index.ts
export { default as Model } from "./model";
export * from "./types";

现在我们可以直接从list导入ChildModel类型。

// src/core/router/restful.ts
import { Model, ChildModel } from "core/database";
import { Request, Response } from "core/http";
import { RouteResource } from "core/router/types";

export default class Restful implements RouteResource {
  /**
   * Base model
   */
  protected model?: ChildModel;

  /**
   * List records
   */
  public async list(request: Request, response: Response) {
    const records = await this.model?.list(request.all()) || [];

    return response.success({
      records,
    });
  }
// ...

这很好,但是如果您记得ChildModel是一种通用类型,因此我们需要将模型类型传递给它,我们可以使用我们的Restful类声明传递该类型。

// src/core/router/restful.ts
import { Model, ChildModel } from "core/database";
import { Request, Response } from "core/http";
import { RouteResource } from "core/router/types";

export default class Restful<T> implements RouteResource {
  /**
   * Base model
   */
  protected model?: ChildModel<T>;

  /**
   * List records
   */
  public async list(request: Request, response: Response) {
    const records = await this.model?.list(request.all()) || [];

    return response.success({
      records,
    });
  }
// ...

现在我们很好,您想让它更加花哨吗?让我们使T类型扩展了Model类,因此我们可以直接从T类型中使用list方法。

// src/core/router/restful.ts
import { Model, ChildModel } from "core/database";
import { Request, Response } from "core/http";
import { RouteResource } from "core/router/types";

export default class Restful<T extends Model> implements RouteResource {
  /**
   * Base model
   */
  protected model?: ChildModel<T>;

  /**
   * List records
   */
  public async list(request: Request, response: Response) {
    const records = await this.model?.list(request.all()) || [];

    return response.success({
      records,
    });
  }
// ...

现在这是一个优雅的代码

最后的问题仍然存在,为什么我最后添加了|| []?好吧,因为也许您会忘记将模型传递到Restful类,因此我们需要确保records变量是一个数组。

ð测试

现在让我们对此代码进行测试,让我们在我们的RestfulUser类中尝试

// src/app/user/controller/restful-user.ts
import { Request, Response } from "core/http";
import Restful from "core/router/restful";
import { RouteResource } from "core/router/types";
import User from "../models/user";

// Note that we passed the model 👇🏻 type as a generic type to the Restful class
class RestfulUser extends Restful<User> implements RouteResource {
  /**
   * Base model
   */
  protected model = User;

  /**
   * Get single record
   */
  public async get(request: Request, response: Response) {
    //
  }

  /**
   * Create record
   */
  public async create(request: Request) {
    //
  }

  /**
   * Update record
   */
  public async update(request: Request, response: Response) {
    //
  }

  /**
   * Delete record
   */
  public async delete(request: Request, response: Response) {
    //
  }

  /**
   * Patch record
   */
  public async patch(request: Request, response: Response) {
    //
  }
}

const restfulUser = new RestfulUser();

export default restfulUser;

现在,我们可以直接调用我们心爱的路由/users,不再添加代码,我们定义了模型并定义了模型类型,因此我们现在可以使用。

这里的另一个好部分是,我们还可以直接使用过滤器,只需尝试/users?name=hasan或您添加的任何值,您就会看到过滤器正在工作!

- 结论

我们只是在这里做了一些非常好的事情,学习了如何使用良好实践的仿制药,也学会了如何实现列表方法,因此我们不必将其写给每个控制器。

â•给我买一杯咖啡。

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

ð项目存储库

您可以在Github

上找到此项目的最新更新

ð加入我们的社区

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

ð视频课程(阿拉伯语)

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

ð奖励内容ð

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

一般主题

软件包和库

React JS软件包

课程(文章)