所以,我们必须知道Restful Api
概念的含义,现在让我们开始在我们的项目中实施它。
工作流程
在我们开始实施Restful Api
概念之前,我们需要了解项目的工作流程,以便我们可以了解如何实施。
我们的第一步是创建一个route.resource
方法,此方法将用于生成特定资源的所有路由,因此我们需要将资源名称传递给它。
此方法应该生成以下路由:
-
GET /resource
-获取所有资源 -
GET /resource/:id
-获取特定资源 -
POST /resource
-创建一个新资源 -
PUT /resource/:id
-更新特定资源 -
DELETE /resource/:id
-删除特定资源 -
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;
};
因此,我们只是定义了一种用于定义资源对象的类型,它包含所有将用于处理路线的方法,处理程序与单一路由处理程序相同,因此在这里没有什么新的。 p>
资源方法
现在,让我们定义我们的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上找到该课程,该课程是阿拉伯语。
ð奖励内容ð
您可能会看这些文章,这肯定会提高您的知识和生产力。
一般主题
- 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软件包
课程(文章)