我们在上一篇文章中看到了如何实现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上找到该课程,该课程是阿拉伯语。
ð奖励内容ð
您可能会看这些文章,这肯定会提高您的知识和生产力。
一般主题
- Event Driven Architecture: A Practical Guide in Javascript
- Best Practices For Case Styles: Camel, Pascal, Snake, and Kebab Case In Node And Javascript
- After 6 years of practicing MongoDB, Here are my thoughts on MongoDB vs MySQL
软件包和库
- Collections: Your ultimate Javascript Arrays Manager
- Supportive Is: an elegant utility to check types of values in JavaScript
- Localization: An agnostic i18n package to manage localization in your project
React JS软件包
课程(文章)