📱

Get Our Mobile App

Take your business learning on the go!

Download on the App StoreGet it on Google Play

DAY - 5 | NODE.JS BEAST’S RESTFUL API SECRET – RULE THE BACKEND LIKE A PRO - 5 DAYS FREE BOOTCAMP

DevTown39:41

Transcription

是的,大家晚上好。嗯,欢迎来到我们训练营的第五天,而且很可能,不,很明显,这是我们这个后端系列训练营的最后一天。嗯,现在,让我们进入我们剩下的主题。好的。所以我们已经完成了 `/task` 的 get 请求,并且我给了你们一个完成按 ID 获取任务的作业。我希望你们已经完成了。除此之外,还有一个注册或登记路由。所以我已经将这两个代码都添加到了代码沙箱中。所以你们可以对照自己的代码验证一下。如果还没完成也没关系。我们可以看看我们写过的代码。好的。这是我们之前做的一件事。那么今天我们要完成哪些事情呢?所以今天,首先,这段代码有一个问题。问题是什么?我们将 MongoDB URI 直接添加到代码中,而我们不希望这样。我们希望从环境变量中获取它。所以这是我们应该解决的第一件事。所以我们首先会修复这一部分,一旦这一部分修复好了,我们就会去处理我的删除路由和我的更新路由。好的。所以这两个路由还剩下,一旦它们完成,我们就完成了代码,然后我们将进行部署。部署之后,一旦我们的部署完成,我们会进行测试。我们会测试一两个路由,如果它们工作正常,那么我们将理解你们在这个训练营中有什么作业,然后我们就结束了。好的。所以这就是我们今天要做的事情。所以,让我们快速开始这个。让我们看看在这种情况下我们如何添加环境变量。所以为了在这种情况下添加环境变量,我们需要的是 `env`。好的。所以这种情况需要 `env`。所以我们将导入 `env`。我们已经安装好了,现在我们要导入它。所以我们到底为什么需要它呢?好的。所以既然我们要把它创建为环境变量,我们就不希望我的密钥。所以 URL 现在是一种密钥,我们不希望我的密钥公开。所以出于这个原因,我正在创建我的 `env`。所以我会执行 `require('dotenv')`。好的,`require('dotenv').config()`。这是我用来导入我的 `env` 到我的文件中的必需语句。一旦我的 `env` 被导入,接下来。好的,你们现在可以忽略这个错误。不用去管这个网关错误的。那么我接下来想要的是什么?所以你们可以打开这个分屏,在这里你们会有一个项目设置的选项。在这里你们有一个项目设置的选项。所以你们需要点击这个项目设置。在此之前,我会做什么?我会做什么?我会悄悄地移除这个,我会移除整个字符串,然后我会从这个位置移除并添加其他东西。好的。所以我将执行 `process.env.URI`。我会把它命名为 `URI`。好的。所以这就是我将如何导入这个 `process.env.URI`。现在我必须在我的项目设置中配置这个 URI。所以点击你的项目设置。第一步,你可以直接进行下一步。这里也不需要改变任何东西。然后你们有一个添加变量的选项。添加环境变量。所以点击添加环境变量。那么键是什么?键是 `URI`。好的。键是 `URI`,值。值是我们一直以来使用的相同的值。所以我们将使用我们一直以来使用的连接字符串的相同值。所以在值中,我将添加连接字符串。不需要添加双引号。直接像纯文本一样粘贴即可。好的。你点击保存。然后你继续下一步。然后下一步,然后你必须点击应用并重新启动。这就是如何将环境变量添加到你的代码沙箱中。如何将其添加到你的部署中?我将再次解释。不用担心这个。在完成之后,你必须重新加载它。最多需要 1 分 10 秒。好的。所以,正在重新加载。一旦重新加载完成,我们将继续处理编写我的删除路由和我的更新路由的下一部分。好的。是的。很好。好的。所以,我的更新已经完成了。好的。我接下来能做什么?我现在将继续处理我的删除路由。首先,我将完成我的更新路由。好的。这是我在此情况下需要做的第一件事。所以模型和其他一切都在那里。所以你们可以自己去看看代码。这将给你们更好的了解。所以我们最后做的是按 ID 任务。所以我已经添加了按 ID 任务的代码。所以你们可以去看看,我还改变了启动服务器函数,因为我需要添加所有路由,这样当我启动服务器时,我就可以得到所有我需要浏览的特定路由。好的。好的,很好。所以,现在让我们进入这一点。所以第一个将是我的 put task。put task 将用于更新我的 task。好的。所以我会做 put task。好的。所以在 put task 中,我的函数调用是什么?所以它将是 `app.put`,然后是路由,路由将是 `/task/:id`。好的。在这种情况下,我将发送一个 ID。异步请求,响应,我的箭头函数。好的。所以我在这里获取 ID,因为我想知道我需要更新哪个特定的任务。我不需要更新所有任务。我只需要更新一个特定的任务。好的。所以再次是 try 块,然后我们将有一个 catch 块来处理错误。那么在我的 try 块中会是什么?在我的 try 块中,我将获取任务,`const task = await Task.findById(req.params.id)`。好的,我正在做 `task.await`。好的,它将是 `await Task.findByIdAndUpdate`。好的。所以我们将传递我的任务 ID,以及我还需要更新。所以我会添加并更新。所以 find by ID and update。好的。所以我的任务 ID 在哪里?它在我的 `request.body` 中。所以 `request.params.id`,这就是我们将在这种情况下做的。逗号 `request.body`。好的,很好。所以,这是我们要更新的 ID,然后我们将把整个请求体发送到我的后端,不是后端,而是数据库,然后接下来我必须将其指定为 new,是的,这是新数据。所以这不应该在这里。好的,很好。好的。一个。是的。好的。所以,这是我的 find by ID and update。现在,如果我的任务不可用,我将检查我的任务是否不可用。是的。所以我犯了一个拼写错误,对吧?`TASKS`。所以如果我的任务不可用,在这种情况下我必须返回它。我需要返回什么?`res.status(404).json({ error: 'Task not found' })`。所以我们将发送一个消息,不是消息,而是错误,我会说任务未找到。好的。所以如果任务找不到,那么我们需要发送这个特定的错误,说明任务未找到。如果任务存在,那么我们将执行 `res.json(task)`,我会将我的任务作为响应发送。所以它将是我的更新值。所以所有值都将被更新,并且它将以响应的形式出现。好的。那么在我的 catch 中会是什么?在我的 catch 中,我将有 `res.status(500).json({ error: 'Internal server error' })`。所以是 500,而不是 5000。然后我会执行我的 JSON,错误,在错误中我会说我的内部服务器错误。好的,这就是我的 put 请求。所以这是我的 put 请求,在 put 请求之后,我将有我的 delete task。好的。所以,`delete task`。好的。所以删除任务也将需要我的 ID,因为它需要。为了理解我需要删除哪个实际任务,我需要有我的 ID。所以 `/task/:id`。好的,这就是需要的。好的,再次异步请求,响应,异步请求,响应,然后我必须执行我的删除函数。再次,同样的事情会重复,我会检查我的任务是否已经存在。如果我的任务不存在,我将不得不发送一个响应告诉我的用户任务不可用。如果我的任务存在,那么很好,我会删除它。所以状态是,这是我的 catch 块。好的。500 内部服务器错误 JSON 错误,错误将是内部服务器错误。好的,很好。好的,太棒了。所以,现在在 try 块中会是什么?在我的 try 块中,我会设置,我会检查我的任务。好的。`const task = await Task.findByIdAndDelete(req.params.id)`。好的,在这里我的 T 应该是大写的。是的。所以 `Task.findByIdAndDelete`。不是 `findOne` 而是 `findByIdAndDelete`。好的。现在同样的事情。我们会发送我的,什么?我们会发送我的 `request.params.id`。这次我们不发送任何 body。为什么我们不发送任何 body?因为在这种情况下我们没有什么可以更新的。好的。是的。所以 `request.params.id` 将被发送。一旦任务被删除,再次是任务的拼写错误。好的。`TASKS` 或 `task`。好的。所以一旦它被删除,那么我将发送一个响应。好的。在此之前,我会再次检查任务是否真的可用。好的。任务真的可用。如果它不可用,我将执行 `return res.status(404).json({ error: 'Task not found' })`。然后屏幕上闪烁的错误是任务未找到。好的。如果我的任务可用,并且它已经被删除,那么我将做什么?`res.sendStatus(204)`。这意味着你所做的任何请求,或者 204。所以执行 `sendStatus(204)`,然后我们将执行 `send`。这次我们暂时没有 JSON 响应,因为我们正在处理的任务已经被完全删除了。好的。所以这些是我们在这个后端需要的路由。好的。所以我们做了什么?让我们再看一遍,然后我将继续展示如何创建一个 GitHub 仓库,如何部署它,以及你如何检查你的路由是否有效,以及这个训练营的确切作业是什么,我将分享。好的。所以,现在让我们从头开始看看我们做了什么。所以首先,我们连接了我们的 MongoDB。好的。所以之前我们是通过连接字符串直接做的,但现在我将我的连接字符串添加到我的环境变量中,然后我在这里获取它。好的。我们为什么要这样做?因为如果我直接将这段代码推送到 GitHub,我会收到一个依赖警告,或者我会收到一个密钥泄露警告。好的。因为 MongoDB URI 被认为是密钥。所以出于这个原因,我不想发生这种情况。我不想发生任何密钥被盗的情况。所以这就是为什么我创建了一个环境变量,然后我将其推上去。好的。很好。然后呢?然后我连接了我的数据库,并且我还添加了一个 catch 块,以防有任何错误。然后我创建了两个模型。一个是我的任务模型,另一个是我的用户模式。好的。这是我们创建的两个模型。所以,然后很好。好的,一次。是的。所以我们也创建了一个 `validateTask` 函数。为什么?因为我们需要验证我们收到的任务请求。如果收到的任务请求结构无效怎么办?我们不希望发生这种情况。所以出于这个原因,我们有一个 `validateTask`。之后,我们有了我的 JWT 中间件。在这里我们将验证令牌,我们将创建令牌。所以这就是我们将要做的。最重要的是,我们只是验证我们已经拥有的令牌。好的,这就是我们正在做的。然后我们有了我的注册路由。所以这是我的注册或登录路由,我从我的用户那里获取用户名和密码,然后我检查用户名是否已经存在。如果用户名不存在,那么我将创建一个新用户,并且我还会生成一个令牌。好的,在之前的情况下,当我解释时,我们在注册时没有生成令牌,但现在我们在注册的第一个实例中就生成了它。好的,我们在这方面做了一些改变。好的,在用户登录中,我们只是验证我的令牌,如果我有令牌并且我的令牌是正确的。如果我的令牌是正确的,那么就好了,我们可以继续。应该是密钥。然后我们有了我的第三个路由 fetch task,这将从后端获取我所有的任务。好的,无论我发布了什么任务,它都会获取我的任务。然后我有了 create new task post。这将在我的后端创建我的新任务。然后我有了 get task by ID。这将根据我拥有的 ID 获取我的任务。好的。然后我有了 put task。这是用于更新任务,如果我想更新我的任务。然后我有了 delete task,是的,然后,然后只是启动服务器,没有别的了。好的。所以这些是我创建的整个后端。我们可以做更多,但现在我们不会深入研究太多东西,因为显然我们的时间有限。所以现在我们可以做什么?接下来我将向你们展示如何从这里创建你的 GitHub 仓库,以及如何部署它。好的。所以我们将把部署放在 Render 上。所以 Render 将是我们实际部署它的地方。好的。所以请稍等片刻,让我们导出到 GitHub。好的。这里有一个导出到 GitHub 的选项。点击导出到 GitHub。在这里你会看到一个创建仓库的选项。好的。然后你移到那里。点击创建仓库。它会自动给你一个名字,但你可以根据你的需要更改它。现在它是私有的。我将把它保持公开,因为我需要在 Render 上部署它。所以出于这个原因,我将其设为公开。然后你可以点击创建仓库。这需要大约 10 到 15 秒的时间。好的。在此期间我们可以等待。我们可以等待并看看发生了什么。好的。好的,很好。所以,我的仓库已经创建了。所以,我将在 github.com 上查看它。好的。所以我将看看我的仓库是否在那里。好的。所以,backend boot camp。这是我需要的 GitHub 仓库,它在那里。我可以看到它很好。所以 index.js 一切都在那里,对吧?是的,一切都在那里。好的,太棒了。那么接下来我们需要什么?所以你已经将你的代码添加到了 github.com。在这种情况下,你接下来需要什么?所以你接下来需要的是部署。所以,让我们看看我们可以在哪里部署这个应用程序,以及我们如何测试它。这是我们接下来要看的内容。所以我们将使用 Render 来部署我们的应用程序。所以你可以去 Render,你可以注册。所以如果你还没有创建你的账户,你可以通过 Google 注册 Render,或者你也可以使用你的 GitHub 来注册。所以我已经注册了。所以我会直接进入我的仪表板。即使我进入仪表板,我也收到一个登录 Render 的选项。所以这些都是你拥有的选项。好的。你可以选择 GitHub、GitLab、Bitbucket、Google,或者你也可以使用电子邮件登录。好的。所以点击这个 GitHub。好的。你正在使用 GitHub 登录。好的。很好。是的。所以一旦你使用 GitHub 登录,你接下来可以做什么?你可以去右上角的这个选项。所以在这里右上角有一个添加新的选项。好的。所以当你点击添加新的时候,你有两个三个选项,你可以有一个静态网站,Web 服务器,私有服务和其他东西。所以我想做的是我想要一个 Web 服务器。好的,这就是我需要的,因为后端被认为是 Web 服务器。所以我会点击我的 Web 服务器。只需点击 Web 服务器。好的。你实际上需要部署什么?我需要部署我的 backend boot camp。我会点击 backend boot camp。好的。好的。所以 backend boot camp,然后我会在这种情况下更改一些配置。好的。模型配置我需要更改吗?好的。所以有些东西会保持不变。不需要改变它。所以如果我向下移动,我可以看到什么?第一件事是服务。你想要哪种类型的服务?我想要免费服务。我不需要任何付费服务。所以我会选择免费服务。如果你向下移动,你将有一个添加环境变量的选项。所以既然我们使用了环境变量,我们将在那里添加它。所以首先你需要给它命名,名称是什么,然后你会给一个值。所以这是我的环境变量的值。好的。所以我将用我的 index.js 检查一次,看看我使用的名称是否正确。是的,它是正确的。URL。好的。我们使用了 URL。是的,没问题。URL,我已经添加了。然后你必须点击部署 Web 服务。好的。所以一旦你点击部署 Web 服务,它将进入部署日志,最多需要 1 分钟来部署。好的。所以我们可以等待。我们将等待 1 分钟。让我们看看这个部署是否完成。好的。好的,它还在构建中。所以我们需要再等一会儿,直到 index.js 文件运行起来,并且我们在这里看到一些输出。我们必须等到那个时候。好的。所以构建成功了。所以在此之后,也应该有一个部署成功的案例,然后我们才能继续。好的。很好。所以我认为它已经启动并运行了,我们可以接下来做什么?我们可以检查一下。好的。是的,它正在运行。所以这意味着我们已经正确配置了。所以,接下来是什么?所以我将打开我的 Canva 文件 2。所以,由于部署已经完成,接下来要做的就是检查这个路由是否有效。好的。所以我们现在必须检查我们创建的路由是否正常工作。这是我们接下来需要检查的事情。好的。所以我的笔记在哪里?这是我的笔记。好的。抱歉,如果这是我的,什么,好的。是的。所以我会在这里添加作业二。好的。让我添加它,然后我会解释你需要做什么。好的。在测试之后,我会解释作业。在此之前,让我先添加它,供你参考。好的。所以,它有一个提交日期。好的,很好。现在,首先,让我们测试一下,让我们在 Postman 上看看一切是否正常工作。所以,这是我的 Postman 窗口。好的。所以,第一件事,我将用我的注册来检查它。好的,我需要用我的注册来检查它,所以你可以使用任何用户名和密码,或者你想为这种情况创建什么。这是你的选择,我将要使用的是,我将使用一些随机的用户名和密码。好的。所以我们将使用这个用户名和密码,我们将执行一个 post 请求,让我们为此发送一个 post 请求。希望我们不会收到任何错误。是的。所以现在我收到一条消息说用户已成功创建。我收到一个 JWT 令牌,我收到用户 ID 和用户名。好的,我的用户,我的登录,抱歉,注册案例工作正常。它没有问题。好的,注册正在工作。登录也会工作。不用担心这个。然后,让我们看看任务。所以,我现在要做的是,我将添加一些任务。在获取任务之前,我需要添加一些任务。好的。所以我正在添加一个示例任务。我已经拿到了一些结构。好的。请记住,我们正在将所有这些添加到 body 中,在我的 headers 和其他东西中。它完全是空的。现在我的 header 中什么都没有。所以,让我们发送它。好的。是什么错误?我收到一个内部服务器错误。这意味着我的任务的 post 路由可能存在问题。好的。让我们看看我的日志。我收到的错误是什么?错误。好的。在某个地方,我写了 `ERRORS`。但我需要写 `ERROR`。让我直接在我的 index.js 中查看。所以如果我无法访问我的 post 路由,这意味着我在这里犯了那个错误。是的。所以这里是我的错误。好的。所以我将直接在我的 GitHub 中进行更改。我为什么直接更改到我的 GitHub?因为如果我从代码沙箱中进行更改,我将无法将该更改直接推送到这个 GitHub 仓库。所以我会在这里进行更改。所以它应该是 `error`,然后我们将提交更改。我们将提交它。好的。一旦提交,我们将获取我们最新的更改。好的,所以部署最新的提交。点击部署最新的提交。去确认。好的,我们将再次等待片刻,直到部署再次完成,然后我们将再次测试。好的,在此之前,一旦部署完成,或者让它花费时间。我将解释你的作业是什么。所以,无论我们到现在为止在训练营中完成了哪些路由,完成了哪些事情,你首先要完成它。好的。然后,你必须创建一个 GitHub 仓库,然后你必须部署它。好的。就像我部署它一样。你必须部署它。你必须向我们发送你的 GitHub 仓库以及你的部署链接。好的。所以这些都是功能。所以无论我们涵盖了哪些功能,你都必须保留它们。好的。同样,你必须保留,并且你必须在 8 月 18 日之前提交。并且你必须再次,我解释了你需要提交什么,你必须提交你的 GitHub 仓库和实时部署链接。好的,这就是你需要提交的。所以 2025 年 8 月 18 日是这项工作的最后一天。好的。很好。好的。所以它正在部署。是的,它正在部署。让我们等待。为什么它在下载 casual?它现在应该下载 caption 文件。好的。在此之前,我实际上不知道是否正在进行考勤。但如果正在进行,请在离开会议前标记你的考勤。你还没有完成,但我只是提醒你。所以请在离开会议前标记你的考勤。还有,在这个训练营之后,很可能如果你收到考勤表,你将有机会参加强化课程。好的。如果你对这个训练营有任何疑问,或者你想问任何问题,你可以注册参加我们的强化课程,强化课程是付费的,为了你的知识。强化课程是付费的。所以如果你真的有疑问,那么你才应该注册,否则,所以让我们把考勤从这个训练营中排除,因为我这边有很多问题。所以如果你对这个训练营有任何严重的疑问,你可以注册参加强化课程,我将亲自为你们每个人在 Zoom 电话中进行课程。好的。还有,既然我们有时间,而且我们还没有部署它,接下来是什么?如果你想和我一起学习全栈开发课程,你也可以和我们一起学习。从 DevTown。我将是你的导师。我将参加我们所有的课程,而且很可能今天是 15 号,我们将从下个月 1 号开始。所以任何有兴趣的人都可以注册我们的课程。课程价格和其他细节将由联系团队分享。如果你有兴趣,你只需要填写网站上的联系表,或者给我们发邮件。联系团队将与你联系,并向你解释所有需要的东西。好的,很好。现在我们利用了我们的时间。好的。我们在这里利用了我们的时间。所以我们有待处理的部署。所以现在我们已经部署了它。现在让我们再次发送它。我们将看看它是否有效。是的,现在它有效了。好的。所以是什么错误?有一个拼写错误,不是我,而是我犯的。所以我们本应该写 `error`,但我写了 `errors`。所以这就是我犯的错误。所以,有一个新的任务被添加了。完成是 `false`,任务 ID 已生成。创建日期,更新日期,以及这些都已生成。好的。所以,同样,如果我做一个 post,如果我做一个 get 请求,让我们看看预期的输出是什么。我不需要在 body 中添加任何东西。好的。现在 body 应该是空的。我正在做一个 get 请求。让我们做一个 get 请求。所以,我又收到一个 get 请求错误。再次,让我们解决它。get 请求错误是什么?我收到“无法读取未定义属性的 ID”。好的。稍等片刻。我做了一个 get 请求,对吧?好的。好的,我做了一个 get 请求。让我们看看代码。我们在 get 请求中犯了什么错误?post 是这个 token JWT 登录?为什么我现在需要重新加载这个窗口?好的,稍等片刻。别担心,这是我将要覆盖的最后一件事。好的。一旦这个 get 请求解决了,我就不再讲任何东西了。所以,我们就到这里。稍等。让我解决这个问题,然后我们就结束。好的。好的。在这种情况下,我没有接受任何名为 ID 的东西。好的。`request.user.id`。好的。用户 ID。好的。在这种情况下,我没有发送用户 ID。对吧?好的。所以,我能做什么?我需要发送一个用户 ID。所以,让我先看看我的系统中创建了哪些用户。MongoDB 地址。我将进行 Google 登录。好的,很好。这不是错误。我不能将其标记为错误,因为我只需要为此发送一个用户 ID。所以,我接下来能做什么?或者,我可以做什么?让我们做一个。可能是这种情况,你不会为所有需要的任务存储用户 ID,因为我们创建的路由在注册时并不接受用户 ID。所以我们可以 kind of 移除这个用户 ID 的东西,我们可以尝试在没有用户 ID 的情况下获取。这就是我认为最好的主意。好的。好的。所以,我接下来能做什么?我将更改这种情况下的代码。我将做什么更改?好的。更改是什么?所以我可以把它改为获取所有任务。好的。这就是我现在正在做的。好的。所以,为什么?因为在某些情况下,用户 ID 没有被存储。所以我会改变它,我将直接获取所有任务,没有任何过滤。好的。所以,这可能是我现在能做的最好的选择。好的。是的。让我们看看我收到的错误是什么?可能会有一些连接错误。是的,我们会收到一个 `motive` 连接错误,因为我们必须再次进行后端连接。所以不用担心这个。好的。所以,同样,如果我在 GitHub 中也改变它。让我们看看我是否遇到任何构建错误或任何东西。好的,各位,请稍等。这是最后一件事。让我们解决这个问题,然后我将结束。好的,我知道代码在哪里?好的,fetch task。所以,通过这个 fetch task,我将移除任何过滤器,然后我将直接获取它。所以,让我们提交更改,然后让我们提交。好的。所以更改已经提交,再次是同样的事情。部署最新的提交。部署最新的提交。好的。很好。就像它是正确的。如果你愿意,你可以检查一下,因为再次,这将花费我很多时间,但让我们等待并看看,如果好的,让我们等待并看看这是否正常工作。因为这是我想检查的最后一个路由,删除路由和其他东西都会正常工作,但不会有问题。因为有些路由我需要你检查。是的,很好。所以,看起来部署正在进行,并且构建成功了。让我们再等一会儿。好的,我认为我分享了其他屏幕,对吧?是的,我分享了其他屏幕。让我回到部署屏幕。好的,你可以看到它现在工作正常了。所以,我们将再次回到我的 Postman,然后我们将再次尝试进行我的请求。好的。所以,让我们现在发送一个 get 请求。好的,现在我收到了我的,现在我收到了我的所有任务作为响应。好的。所以,之前我们是根据用户 ID 来获取的,但我们实际上并没有发送任何用户 ID。所以,这就是为什么我改变它,以便从后端获取所有任务。好的,很好。好的,各位,所以再次,这将是我们训练营的结束。我们已经涵盖了很多内容。请查看已共享的代码。请查看已共享的笔记。在你的笔记的末尾,附有作业。有日期,截止日期,所有内容都已在其中给出。所以请遵循它,并请按时提交。所以我们将在这里结束。希望我们能在下一次训练营中再次见面,可能在本月底或下个月初。好的。所以,如果你有任何疑问,你可以注册参加强化课程,并为在这个现场训练营中遇到的延迟、问题和困难道歉。所以这就是为什么它被转换成了录制训练营。好的。所以这是一个问题。所以从下一次训练营开始,我们将尽量避免这些问题。所以感谢所有人的加入。我们希望在下一次训练营中再次见到你们,就像我们现在一样。所以,让我们在这里结束。现在就到这里。希望从下一次开始一切都会顺利。所以,谢谢大家的加入,希望下次再见。晚安,各位。再见。