Transcription
是的。大家晚上好。由于我所在地区有气旋问题,我认为我们需要以录制的方式进行本次会议。所以,我们可以继续进行昨天的地方,据我记忆,昨天我们实际上是在处理理论部分,所以今天我告诉你们,我们将继续进行实践部分,在那里我们将实际构建一个应用程序,或者说我们将构建一个API。那么我们究竟要从哪里开始呢?首先,我们将从Express开始,以了解Express是什么。你们可能知道Node,但我们也使用Express与Node一起使用。所以,我们将大致了解Express的基础知识,然后我们将继续进行API创建,在那里我将告诉你们我们基本上是如何首先创建一个服务器,然后我们将创建一个示例API。所以,欢迎回到第二天,再次为昨天因问题而造成的干扰深表歉意,是的,我们计划以这种方式进行,以免会议因某些自然问题而中断。好的。那么,ExpressJS,ExpressJS究竟是什么?我们称它为轻量级的NodeJS框架。好的。它是NodeJS框架。它与NodeJS没有分离。所以,它只是一个NodeJS框架。所以,它是一个轻量级的NodeJS框架,我们在创建服务器时使用它,我们在创建服务器时使用它。好的。所以,这就是ExpressJS。我们没有别的了。ExpressJS使用它是一个用于创建服务器的NodeJS框架。在这个服务器中,你们知道我们将进行哪些请求。首先,我们将使用POST请求。POST将是第一个。然后我们将有GET,我们将有PUT,我们将有PATCH以及DELETE。所以,这些都是我们将通过使用ExpressJS进行的潜在请求。好的。除此之外,我们还将使用body-parser,这是一个中间件,用于处理我们收到的任何JSON文件。所以,这也将是我们的部分。所以,如果现在是实践部分,我将编写所有代码在codesandbox上。但是,如果你们在本地系统上,并且想在本地系统上继续,没问题,你们可以这样做。如果在本地系统上,那么在这种情况下,你们首先需要执行npm init -y,或者仅仅是npm init也可以。所以,初始化npm是第一部分,然后你们需要执行npm install express。这个命令仅适用于在本地系统上工作的人,比如VS Code或其他。但是,如果你们跟着我一起做,并且正在使用codesandbox,那么你们就不需要这些东西了。好的。好的。所以,很棒。所以,这只是一个非常简短的介绍,让我们直接进入我的codesandbox,我想在那里集中精力。所以在codesandbox上,我想创建一个新项目,新项目将是HTTP Express服务器。所以,Node HTTP服务器是我想要创建的。在这种情况下,我们没有单独称为Express服务器的东西。我们将在我们的NodeJS中将Express作为一个模块安装,然后我们将使用它。好的。所以,让我们继续,点击它。让我们给它命名。所以我将把它命名为API Bootcamp。然后,如果你想让它公开,你可以。这是你的选择。但我认为,好的。所以我也会把它设为公开,因为我需要与你们分享。所以我将把它设为公开。所以,如果你愿意,你也可以选择私有。所以我将点击创建开发框,它将需要一些时间来安装。好的。所以,一旦它安装好了,第一部分或第一个任务是,我们必须安装我们的Express。所以,我们将安装Express,然后看看我们如何继续。所以,我的工作空间已经构建好了,让我们看看它加载。好的。所以,它完成了。所以,现在这是我的README,在我的node_modules中,我有一个index.js。所以我将在那里编写所有代码。现在它是HTTP服务器。我们将首先关注的部分是创建服务器。好的。所以,这是我们将要关注的第一部分,即如何使用ExpressJS确切地创建服务器。一旦我们完成了服务器,然后我们将继续创建一个API,其中我将添加一些POST,GET,我想它也会有DELETE。所以,我们将今天完成这三个部分,其余的明天,以及明天的部署部分。所以,让我们继续,首先安装我的Express。所以,在左侧底部,你们会看到一个依赖项选项。所以,在那里你们需要搜索Express。然后你们会得到一个选项,你们需要点击Express,它将默认安装Express。现在,再次,如果你们在本地系统上,对于类似的任务,你们需要执行npm install express,或者npm install express。好的。所以,安装部分已经完成。所以,现在我将删除这个旧的HTTP代码。所以,让我们开始服务器创建部分,让我首先告诉你们,服务器将监听端口号3000,这是我决定的端口,如果你们想使用8080或其他端口,你们可以自由选择,我们在这方面没有限制。接下来,我们将添加一个简单的路由来检查我的API是否工作。这将是我们添加的唯一一件事。所以,让我们开始,第一件事是const express = require,我将在这里导入Express。好的,这是第一部分。然后我将定义我的应用程序。所以,const app =,然后我将把我的Express嵌入到这个应用程序中。现在,app是我以后将一直使用的关键字。好的。所以,app.use,它将是express.json。我正在定义,我正在告诉我的Express服务器,在这种情况下,任何数据传输都将是JSON格式。好的。所以,这就是为什么我使用express.json。好的。现在,我需要的第一条路由是app.get。如果我收到一个请求,现在我告诉你们,我们在服务器中处理请求响应格式。我们收到某个项目的请求,然后我们发送该项目的响应。我们就是这样工作的。所以,现在请求是在哪个点发出的?你们有URL,你们有端点,你们在那里发出请求。所以,在这种情况下,如果我谈论本地主机,那么localhost:3000将是请求URL,并且我们有不同的路由。所以,当我们使用codesandbox时,它将是codesandbox提供的默认URL。所以,假设我收到这个请求,这是主要的默认URL。如果我收到该URL上的请求,那么在这种情况下我应该提供什么?好的。所以,请求,响应。这将是结构。记住,服务器总是基于请求响应模型工作。在收到特定请求之前,不会给出响应。好的。所以,如果我收到这个请求,我将发送一条消息。欢迎来到API Bootcamp。好的,这将是我将发送的响应,它将显示在屏幕上。现在我已经完成了,我包含了Express,我定义了我的应用程序。我已经调用了我的express.json。我创建了一个GET请求。好的,GET API。所以,现在下一部分是我必须创建一个端口,以便我的服务器可以监听。好的。所以,const port。所以我将定义一个端口号。所以我将其定义为3000。如果你们想使用8080或其他端口,你们可以自由选择。所以,app.listen。所以,我将传递的第一个参数是端口号。好的。所以,记住,当我们使用本地系统时,我们将有端口号。一旦你们部署了你们的后端应用程序,情况就不同了。但是,当你们使用本地系统时,你们必须使用端口号。好的。好的。所以,箭头函数将被定义,如果它成功执行,或者如果这段代码成功运行,并且我的服务器打开了这个端口进行监听,那么在这种情况下,我必须给一个控制台日志,只是一个小控制台日志,告诉我自己服务器正在成功运行。好的,服务器正在端口3000上运行。好的,这将是我的响应。所以,让我们保存这段代码,然后看看输出。是的,我得到了输出,服务器正在端口3000上运行。这意味着现在一旦你们得到这个输出,服务器正在端口3000上运行。有两种情况。一是你们没有犯任何语法错误。另一个是你们的代码是正确的。好的。所以,同样的意义是,只有当你们的代码是正确的时候,你们才会收到这个输出。好的。所以,只有当你们写的一切都正确时,你们的端口才会打开。好的。所以,让我们看看,如果我们能在窗口上得到任何响应。好的。让我们做一件事。让我们移到另一个窗口,然后尝试访问它。请给我一点时间,让我们测试一下。好的。所以,这需要时间。所以,是的,继续预览。网关错误。好的,它不允许我从这里进入。没问题。我将从那里查找。好的。好的。所以,我想你们已经理解了我们是如何创建服务器的。所以,即使我们没有得到输出,它也不重要。所以我将把这段代码添加到注释中,这样当你们回到这个注释时,你们就可以得到代码。好的。好的。所以,这是第一部分,即服务器创建。好的。所以我也会为你们添加一个标题,即服务器创建。好的。很棒。那么,在这种情况下,下一部分是什么?好的。所以,我创建了一个服务器,那么下一步应该是什么?现在怎么办?下一步应该是用这个服务器创建一个API。好的。所以,我必须用服务器创建一个特定的API,我必须检查测试部分今天不会完成。显然,我将首先部署这个应用程序,然后我才会测试它。所以,我们现在所做的一切,记住,我们现在不会得到输出。好的,因为这是后端部分,我们正在codesandbox上工作。所以,我将向你们展示的任何输出,我将向你们展示的任何测试都将在部署之后。好的。所以,让我们再次删除这段代码,然后让我们继续进行下一部分,即我的API创建。所以,首先,让我们分解一下我将为我的API添加哪些功能。好的,API创建是第二部分。所以,我将添加的第一件事,我正在创建一个Notes API。好的,Notes API。第一件事是,在第一部分,预设条件是,我不连接任何数据库。所以,我将把它保持简单,以便明天的会议。我们将连接数据库,我们将替换旧代码。但现在我们不连接任何数据库。在这种情况下,我们实际上要做的是创建一个对象。创建一个对象。我希望你们知道代码中的对象是什么。所以,将创建一个对象,我们将添加一些虚拟数据在那里,我们将尝试检索它。所以,第一部分将是一个GET端点。好的。所以,第一部分将是GET端点,GET端点将获取所有Notes,这是第一个端点。然后,在GET端点之后,我将做的第二个是POST。所以,POST将用于添加所有Notes。好的,创建所有Notes,这将是第二个。然后,在此之后,我将拥有的第三个是PUT。所以,对于PUT,我们需要更新东西。所以,更新Notes将是第二部分。然后,在PUT之后,我将有一个DELETE选项。好的,我现在不添加任何PATCH。我们将看看我们是否有任何空间添加PATCH。所以,我们将添加它,现在我们跳过它。好的,删除Notes。所以,这些是我想要创建的所有API请求。所以,每当我收到所有这些请求时,我都想为该情况提供一个特定的响应,正如你们所知,我们正在处理非数据库,不是与数据库。所以,我们实际上不会创建任何模式或模型,这将在明天完成。显然,我们将创建它。但现在,我们将使用虚拟数据。好的。所以,让我们继续,让我们尝试编写代码。但在此之前,让我看看我是否从这里得到了一些东西。好的。问题是预览是在8080上,而我正在3000上发出请求。好的。所以,频道在3000上打开,并且预览。是的。现在我得到了欢迎来到API Bootcamp。好的,我得到了输出。是的。所以,问题是codesandbox在8080的预览上工作,而我打开了3000的频道。所以,3000和8080显然是两个不同的数字。所以,显然,这就是为什么它不起作用。所以,现在它表明我已经正确创建了我的服务器。我的服务器没有任何错误,我可以继续进行。所以,在这种情况下,我需要继续什么?所以,再次,我没有额外的安装部分。我将使用Express,以及类似的东西。所以,这部分保持不变。不需要安装任何其他依赖项。所以,Express在那里。App在那里,app.use(express.json)在那里。现在我将删除这部分。好的。所以,服务器已经存在。8080已经保留在那里,我不想去动它。我们现在将保持原样。让我改变一些东西。8080。好的。所以,我们现在需要的第一部分是创建一个对象。所以,我们需要首先创建一个对象,它将保存数据,因为我们还没有连接数据库。所以,为了保存我的数据,我们需要创建一个对象。所以,const notes = {};。所以,现在每个对象的结构是什么?所以,第一件事是ID。所以,为了识别资源,然后我将有一个标题。所以,标题,学习NodeJS。好的。还有内容,如果你想添加一些内容,你可以添加它,以理解Express服务器。我将把它添加为另一个内容。现在,让我们添加另一个。在这种情况下,ID应该是主键,即ID,每个ID都应该是唯一的。所以,这就是为什么我保持我的ID不同。所以,标题,所以,我将添加练习测试API。内容将保持为使用Postman测试你的API。好的。所以,这是我的,你们可以称之为虚拟数据,现在。让我扩大我的窗口大小。好的。也让我扩大你们看到的文本大小,这样当你们在屏幕上看到它时会更清楚。好的。它更好。好的。所以,这是我的对象。现在,我已经创建了我的对象。所以,现在剩下的事情是我想要创建的GET请求。所以,对于GET请求,我需要创建一个GET端点。从哪里我将得到这个作为响应。所以,我将做app.get。记住,你们期望的请求类型名称应该是这样的:app.get, app.post, app.put, app.patch, app.delete。好的,所以,app.get,所以,端点应该是什么?端点应该是notes。现在,两件事,即请求和响应。每次我们都必须定义这个,这是一个案例。现在,在这种情况下,我需要将整个notes对象以JSON形式返回。记住,请求响应,无论发生什么,响应都应该是JSON形式。好的。所以,现在它不是JSON形式,它是对象形式,但不是JSON形式。好的。所以我将只写res.json,然后我将发送它。好的。所以,完成。好的。第一个端点只是将我创建的对象原样发送给我的用户,这就完成了。好的。如果你想在这里添加一个try-catch块,你可以添加它。所以,如果你们在发送这个请求回来的过程中遇到任何错误,那么你们就可以使用它。但现在,我认为我们不会遇到任何错误。为什么?因为数据库再次没有连接。不会有连接问题。我们拥有的任何数据都在我的代码中。所以,我找不到任何错误。当我们再次切换到我的数据库部分时,我将使用try-catch块。好的。然后我有app.post。好的,app.post/notes。现在,端点是相同的,记住,对于GET请求和POST请求,我将我的端点保持相同,即/notes。好的。所以,这可以工作,这可以正常工作,为什么?因为这是我将要发出的两种不同类型的请求。一个是POST,另一个是GET。好的。所以,我实际上不必担心。所以,app.post和notes。所以,在这种情况下,我需要创建新的Notes。所以,const newNote = {};。所以,我需要什么?我需要ID。所以,ID需要自动生成。所以,我将首先找到这个对象的长度,然后加一。所以,ID。所以,ID将通过notes.length + 1找到。然后,ID之后,下一件事是什么?下一件事是标题。所以,让我们定义一个标题。所以,现在,当我为此发出请求时,我将把标题与此一起嵌入。好的。所以,request.body.title。所以,标题将从body中获取。然后我有内容。好的,所以,内容将再次从request.body.content中获取。好的。所以,这是我的新Notes,它已经被创建了。现在,我只需要将这个Note推送到我已创建的对象中。好的。所以,notes.push(newNote)。好的,这将是完成。所以,我将这个Note推到了我已创建的对象中,事情还没有完成。我必须告诉我的用户,你们试图创建的Note已经成功创建。所以,对于这种情况,我实际上需要给他一个响应。好的。所以我将做res.status(201)。我们已经讨论过201是什么。我将发送一个JSON响应,告诉一条消息:Note has been added。好的。Note has been added。所以,这是我的API的第二部分。第三部分是PUT。好的。所以,我需要现在做PUT请求。所以,app.put,端点应该是/notes/:id。现在,我还需要在端点中包含ID。所以,为了识别我需要更新哪个资源,我需要获取一个ID。好的。所以,我将把ID与我的URL一起获取。记住,我将ID直接嵌入到URL中。所以,它不是一个查询参数。它显然不是一个查询参数。所以,我们嵌入了我的ID本身直接在URL中。查询参数也包含在URL中。但它不是查询参数。当你们想过滤掉某些东西时,就会定义查询参数。好的。现在你们没有过滤掉任何东西,而是响应,但你们只是找到一些东西并更新它。所以,现在你们的任务是找到,如果它不是查询参数,那么在这种情况下,我们确切地使用什么词来表示,当我们嵌入某些变量时,假设我们将ID嵌入到URL中,那么我们确切地称它为什么?好的,这是你们的任务。接下来是请求响应。我通过告诉你们它不是查询参数来让你们的工作更轻松。它与查询参数类似,我们称之为。所以,第一件事我需要搜索,但在此之前,我需要从URL中取出Note ID。好的。所以我将调用const noteId = parseInt()。为什么我们要调用parseInt?因为URL是字符串形式,我需要一个整数。Params.id。所以,第一部分是这个。我取出我的ID,然后第二部分是我需要搜索具有这个特定ID的Note。所以,notes.find。我昨天告诉你们,当我教你们PUT时,如果这个Note不存在,那么我就不能进行任何更新。所以,首先我必须检查Note是否已经存在。好的。所以我将与我的noteId进行比较。好的。然后我将添加一个if条件。所以,if条件将检查Note是否已经存在。所以,我将添加一个Note,即Note不存在。那么我需要返回res.status(404)和一个JSON响应,告诉我的用户Note不可用或Note未找到。好的。所以,这将是我将提供的响应。现在,让我们继续,如果我的Note在那里,那么在这种情况下,我需要完全更新这个。所以我将做myNote.title。第一个更新是myNote.title。所以,我将从body中获取。显然,当我发出PUT请求时,我需要发送更新的标题和内容。好的。所以,我需要发送其中一个。所以我将从请求body中获取。如果它不存在,那么我将只添加旧数据。好的。所以,request.body.title。现在,这是在用户发送了新的Notes标题的情况下。如果用户没有发送新的Notes标题,那么在这种情况下,我将只使用旧数据。然后我有第二部分,即Note内容。所以,noteContent = request.body.content。如果内容不存在,那么我将只做note.content。好的。是的。所以,这是发送响应的部分,res.json,告诉用户我们已经做出了更改,消息Note updated successfully。好的。所以,这是我的PUT。现在,我在这里的最后一部分是我的DELETE。好的。所以,再次,DELETE将做类似的事情。如何类似?我将在我的URL中获取ID。我需要取出那个ID。我首先需要检查那个ID是否可用。如果那个ID可用,那么我必须从对象中执行删除操作。好的。所以,这就是我需要做的。所以,让我们继续,让我们定义,所以,app.delete('/notes/:id')。再次,ID,记住,PUT和DELETE的两个路由都类似,但因为我们发出两种不同的请求,所以这不会干扰我们的过程,request, response。好的,很棒。所以,app.delete('/notes/:id', request, response)。所以,在这种情况下,我们拥有的第一件事是const noteId =再次,同样的事情,即parseInt()。好的。所以在parseInt()中,我们首先将取出request.params.id。好的。所以,request.params.id是我们取出的。好的。现在,我们在这里拥有的下一件事是,我们再次取出索引。我现在将以不同的方式搜索,在PUT中。我们在DELETE中以不同的方式进行。我们可以类似地进行,但是的,我想探索更多选项。所以,我将进行findIndex选项,因为我需要找到可用项的索引。所以,现在我如何识别项目是否不可用?我将告诉你,请给我一点时间。好的。所以,noteId。好的。所以,这是情况。现在,如果我的项目在我的对象中不可用,那么它将返回我一个索引-1。好的。所以,在对象中,这是JavaScript中的一个规则。当任何项目不可用,并且你们试图查找该项目的索引时,在这种情况下,你们会得到一个索引-1。所以,我将进行的if条件是,如果我的索引等于三等号-1。现在,这表明我的项目不可用。好的。这表明我的项目不可用。所以,返回res.status(404),我将发送一个JSON响应,告诉我的用户Note not found。好的。现在,这是第一种情况。这是我处理过的边缘情况。现在,第二种情况,如果我的项目可用,我该怎么办?如果我的项目可用,那么我将做notes.splice(index, 1)。好的。所以,notes.splice(index, 1)。所以,这是第一部分。现在,我将只发送一个响应。所以,res.json,然后直接让我们发送一条消息,告诉用户Item has been deleted successfully。好的,就是这种情况。好的,没问题。如果你们想,你们也可以添加一个默认路由来检查事情是否正常工作。所以,如果你们可以,请添加app.get,类似的事情,我们之前做过。所以,request, response,我将发送res.send("Welcome to API")。好的,没问题。所以,现在让我们做我们的任务,看看,让我们保存它,看看事情是否正常工作。好的。所以,我已经保存了它,我得到了输出。服务器正在端口8080上运行。这意味着我没有犯任何错误。好的。这意味着什么?我没有犯任何错误。在这种情况下。无论写了什么代码,一切都是正确的。现在,我只能检查一个路由,即/notes,其他事情需要用Postman来测试。所以,我稍后会测试它。所以,让我们去/notes,然后看看输出。好的。所以,我得到了我的输出,就是这个。好的。我得到了它。所以,这意味着我写的一切都写得正确。如果你愿意,让我们做一件事。让我们尝试用Postman来测试它。好的。我不能,因为我写的东西在我的codesandbox上。所以,我必须先部署它,然后我才能测试它,但我们现在不会部署它。我们将一起完成它。当我们添加了我的后端部分后,我们就可以部署它了。所以,现在我们可以看到,明天我们将添加后端部分,抱歉,数据库部分。所以,让我们快速看看数据库以及如何创建集群等等。好的。所以,在这种情况下,我们将使用MongoDB Atlas。好的。所以,去MongoDB Atlas,如果你还没有注册,那么就在那里注册。所以我将做我的登录工作,因为我已经注册了我的MongoDB Atlas。所以,让我们继续使用我的电子邮件ID。请专业,让我们继续使用Google。我认为。它没有拾取电子邮件ID。好的,电子邮件ID写错了。是的。好的。所以,我进来了,现在记住,我们必须首先做一件事,那就是创建集群。好的。所以,数据库将如何接收你的数据?所以,我们需要创建一个集群,然后在集群中我们将有一个集合。好的。所以,你们需要实现的第一件事是你们的集群链接。好的。所以,集群链接,然后我们将嵌入,然后是你们的集合名称,我将向你们展示,你们不必担心。好的。所以,让我首先终止我拥有的这个特定集群,因为我需要创建一个新集群。所以我将点击,好的,让我们回到这里,进入你们的集群,记住MongoDB Atlas只给你们创建一个免费集群。所以,如果你们已经创建了一个集群,试着使用那个集群。因为你们将没有另一个选项来创建另一个免费集群。所以我将首先终止这个集群。好的。一旦它被终止,然后我将创建另一个集群。好的。好的。所以,集群,我认为它正在被终止。请稍等片刻。它将被终止。好的。好的,我可以回到我的数据库。现在,项目概览。好的。现在,我没有看到任何集群。所以我将点击创建集群。你们需要做的第一件事是点击创建集群。它将花费一些时间。你们可以随便命名它。好的。所以,我认为我的旧集群还没有被删除。它需要时间吗?部署更改当前计划。好的,请稍等片刻。好的,它被清除了。好的,现在它被删除了。所以,我将点击构建集群。然后,我将得到一个免费计划的选项。好的,记住,在这种情况下不需要购买任何付费计划。所以,我得到了一个免费计划。默认情况下,它将我命名为Cluster 0。所以,我将再次进入我的免费计划。不需要去任何Flex或M10,任何可能的。我们将使用的将与免费计划一起正常工作。好的,绰绰有余。所以,现在你们需要点击创建部署。好的,点击创建部署,如果你们想改变AWS的区域,等等,你们可以,但我建议你们不要改变任何东西,就保持原样。现在你们需要获得一个连接字符串。所以我将继续使用我的Compass。好的。所以,我已经安装了我的Compass。我将去告诉它,是的,我已经安装了我的Compass。所以,这是你们集群的连接字符串。好的,你们得到了你们集群的这个连接字符串。所以,只需复制它,然后放在你们的代码底部。所以,我们将为明天的会议使用它,我将注释掉它。好的。现在,需要注意的一件事是,在这里你们会看到一些称为DB密码的东西。所以,每次你们在MongoDB Atlas上作为用户登录时,都会为你们创建一个DB密码。好的。所以,你们需要找到你们的DB密码。所以,MongoDB给了你们什么DB密码,或者你们创建的DB密码。所以,你们必须把它放在这里。所以,你们将如何获得DB密码?所以,如果你们记得,那就太好了。如果不记得,那么你们需要去这里。所以,将DB密码替换为你们的,然后去数据库。好的,点击数据库访问。它将引导你们到你们创建的用户。所以,现在我只有一个用户。你们需要做的是,如果你们不记得密码,就进入编辑选项,在编辑选项中你们会得到密码。好的。所以,你们将得到编辑密码的选项。这就是你们将获得DB密码的方式。所以,你们从那里获得的密码,只需要替换掉。好的,这就是你们需要做的。除此之外,你们不需要做任何工作,一切都好。所以,如果你们已经完成了直到集群的所有工作,如果你们已经获得了连接字符串,如果你们已经替换了密码,那么你们就没问题了,你们做得很好。好的。所以,我将在结束会议之前完成的一件事是,现在这是你们集群的连接字符串。在集群中你们有集合。好的,在集群中你们将有多个集合。所以,现在我们正在制作Notes,或者我们正在制作一种待办事项。所以,现在这些Notes应该在一个名为Notes的集合中。所以,为此,我将添加/notes。好的。它意味着什么?它意味着在Cluster 0这个集群中,将有一个集合,名为notes。好的,这就是它的意思。所以,直到这里,你们就有集群的连接字符串,这是集合的名称。好的。现在,在任何集群中,如果没有创建连接,那么默认情况下它将创建一个新集合。如果具有该名称的集合已创建,那么它将开始使用该集合。好的。所以,请记住这些事情,我不会让这次讲座太长。所以,只需拿起这些代码,练习一下,是的,这就是我将要告诉你们的。当我们通过添加数据库来完成这部分工作后,我们将进行测试。所以,在那之后,我们将测试我们创建的每一个路由。所以,是的,现在我将把事情留在这里。我希望一切都会清楚。如果你们有任何疑问,我们将在最后的会议中解决。希望我能够进行最后的会议。所以我将在那里解决它。在此之前,请继续练习所有已完成的事情,我明天将在7点与你们见面。所以,感谢你们的加入,并且非常抱歉,我感谢你们的耐心,以这种方式与我们一起前进。所以,是的,感谢你们的加入。明天同一时间再见。好的。再见,各位。谢谢。