Deno 是一个现代化的 JavaScript 和 TypeScript 运行时,在近几年越来越受到前端社区的欢迎。它提供了许多 Node.js 无法提供的优点,例如安全性、稳定性和开箱即用的 TypeScript 支持。在 Deno 中,我们同样可以使用 Express.js 这一流行的 Web 框架来构建后端应用程序。
在本文中,我们将介绍如何在 Deno 中使用 Express.js 构建一个简单的 RESTful API,并提供详细的教程和示例代码。
安装 Deno 和 Express.js
在使用 Deno 和 Express.js 之前,我们需要先安装它们。安装 Deno 可以通过官方网站来完成,它提供了各种不同的安装方式:https://deno.land/#installation
安装 Express.js 需要使用 Deno 自带的包管理器 deno
,可以通过以下命令来安装:
deno install --allow-net --allow-read https://deno.land/x/oak/mod.ts
这里我们使用 Oak 这个与 Express.js 类似的 Web 框架。
构建一个简单的 RESTful API
现在我们已经安装好了 Deno 和 Express.js,我们可以开始构建一个简单的 RESTful API 了。在这个 API 中,我们将提供以下功能:
- 查询所有用户
- 查询特定用户
- 创建用户
- 更新用户
- 删除用户
初始化项目
首先,我们需要创建一个新的 Deno 项目文件夹,并进入该文件夹:
mkdir deno-express-api cd deno-express-api
然后,我们创建一个新的 mod.ts
文件,用于定义我们的 API:
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- ------------- -- - ----------------- - ------- -------- --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个文件中,我们首先导入了 Application
类型,该类可以用来创建我们的 Express 应用程序。然后,我们创建了一个新的应用程序实例,并将其绑定到 8000 端口。接下来,我们使用应用程序的 use
方法添加了一个中间件,该中间件将在每个请求中返回 Hello, World!
。最后,我们通过 app.listen
方法开始监听指定的端口。
现在,我们可以使用以下命令来运行我们的应用程序:
deno run --allow-net mod.ts
如果一切顺利,你应该可以在 http://localhost:8000
中看到 Hello,World!
的输出。
查询所有用户
接下来,我们将扩展我们的 API,以便允许客户端查询所有用户。为了实现这个功能,我们需要创建一个新的路由,该路由将映射到 /users
,并处理 GET 请求。在响应中,我们将返回一个包含所有用户的 JSON 对象。
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- ------------- ----- -- - ------ -------------------------- - ---- --------- ----------------- - - ------ - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- -- ------ -------- ----------------- - ------- -------- - --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个新的代码中,我们使用了 switch
语句来处理路由,如果请求的路径是 /users
,则返回包含所有用户的 JSON 对象。否则,我们将返回前面的 Hello, World!
响应。现在我们可以使用以下命令来测试我们的 /users
路由:
curl http://localhost:8000/users
如果一切顺利,你应该可以看到以下的 JSON 响应:
{ "users": [ { "id": 1, "name": "John Doe" }, { "id": 2, "name": "Jane Smith" } ] }
查询特定用户
接下来,我们将扩展我们的 API,以便允许客户端查询特定的用户。为了实现这个功能,我们需要将路由添加到 /users/:id
路径,并处理 GET 请求。在响应中,我们将返回一个包含指定用户的 JSON 对象。
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- ------------- ----- -- - ------ -------------------------- - ---- --------- ----------------- - - ------ - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- -- ------ ---- ------------- ----- ------ - --------------- ----- ----- - - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- ----- ---- - -------------- -- ---- --- --------------- -- ----- -- ------ - ----------------- - ----- - ---- - ------------------- - ---- ----------------- - - ------ ----- --- ------ -- - ------ -------- ----------------- - ------- -------- - --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个新的代码中,我们使用了一个带有参数的路由 /users/:id
,其中 :id
是一个动态参数,可以通过 ctx.params.id
来访问。在请求中,我们首先获取 id
参数并将其转换为一个数字。然后,我们使用 JavaScript 的 find
方法来查找指定 ID 的用户。如果找到了用户,我们将返回他的 JSON 对象。否则,我们将返回一个 404 错误。
现在我们可以使用以下命令来测试我们的 /users/:id
路由:
curl http://localhost:8000/users/1
如果一切顺利,你应该可以看到以下的 JSON 响应:
{ "id": 1, "name": "John Doe" }
创建用户
接下来,我们将扩展我们的 API,以便允许客户端创建新的用户。为了实现这个功能,我们需要将路由添加到 /users
路径,并处理 POST 请求。在请求体中,我们将提供新用户的数据,并将其添加到用户列表中。在响应中,我们将返回一个包含新用户 ID 的 JSON 对象。
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- --- ----- - - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- ------------- ----- -- - ------ -------------------------- - ---- --------- -- ------------------- --- ------- - ----- ---- - ----- ------------------- ----- ---- - ----------- ------- - ------------ - -- ----------------- ----------------- - - --- ------- -- - ---- - ----------------- - - ----- -- - ------ ---- ------------- ----- ------ - --------------- ----- ---- - -------------- -- ---- --- --------------- -- ----- -- ------ - ----------------- - ----- - ---- - ------------------- - ---- ----------------- - - ------ ----- --- ------ -- - ------ -------- ----------------- - ------- -------- - --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个新的代码中,我们首先将 users
列表定义为一个数组,存储所有的用户数据。然后,我们使用了一个带有参数的路由 /users
,该路由可以处理 GET 和 POST 请求。在 POST 请求中,我们从请求体中读取新用户的数据。之后,我们为该用户指定一个新的 ID,并将其添加到 users
数组中。最后,我们将返回一个包含新用户 ID 的 JSON 响应。
现在我们可以使用以下命令来测试我们的 /users
路由:
curl -X POST http://localhost:8000/users -d '{"name": "Jack"}' -H "Content-Type: application/json"
如果一切顺利,你应该可以看到以下的 JSON 响应:
{ "id": 3 }
更新用户
接下来,我们将扩展我们的 API,以便允许客户端更新用户信息。为了实现这个功能,我们需要将路由添加到 /users/:id
,并处理 PUT 请求。在请求体中,我们将提供要更新的用户数据,并将其替换掉指定 ID 的用户数据。在响应中,我们将返回一个包含更新用户 ID 的 JSON 对象。
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- --- ----- - - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- ------------- ----- -- - ------ -------------------------- - ---- --------- -- ------------------- --- ------- - ----- ---- - ----- ------------------- ----- ---- - ----------- ------- - ------------ - -- ----------------- ----------------- - - --- ------- -- - ---- - ----------------- - - ----- -- - ------ ---- ------------- ----- ------ - --------------- ----- --------- - ------------------- -- ---- --- --------------- -- ----- -- ---------- --- --- - -- ------------------- --- ------ - ----- ---- - ----- ------------------- ----- ---- - ----------- ------- - --------------- -- ---- ---------------- - ----- ----------------- - - --- ------- -- - ---- - ----------------- - ----------------- - - ---- - ------------------- - ---- ----------------- - - ------ ----- --- ------ -- - ------ -------- ----------------- - ------- -------- - --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个新的代码中,我们使用了 findIndex
方法来查找要更新的用户数据。然后,我们使用了 UPDATE 请求将新数据替换为旧数据。最后,我们将返回一个包含更新用户 ID 的 JSON 响应。
现在我们可以使用以下命令来测试我们的 /users/:id
路由:
curl -X PUT http://localhost:8000/users/1 -d '{"name": "Jack"}' -H "Content-Type: application/json"
如果一切顺利,你应该可以看到以下的 JSON 响应:
{ "id": 1 }
删除用户
最后,我们将扩展我们的 API,以便允许客户端删除用户。为了实现这个功能,我们需要将路由添加到 /users/:id
,并处理 DELETE 请求。在响应中,我们将返回一个包含删除用户 ID 的 JSON 对象。
-- -------------------- ---- ------- ------ - ----------- - ---- --------------------------------- ----- --- - --- -------------- ----- ---- - ----- --- ----- - - - --- -- ----- ----- ---- -- - --- -- ----- ----- ------ -- -- ------------- ----- -- - ------ -------------------------- - ---- --------- -- ------------------- --- ------- - ----- ---- - ----- ------------------- ----- ---- - ----------- ------- - ------------ - -- ----------------- ----------------- - - --- ------- -- - ---- - ----------------- - - ----- -- - ------ ---- ------------- ----- ------ - --------------- ----- --------- - ------------------- -- ---- --- --------------- -- ----- -- ---------- --- --- - -- ------------------- --- ------ - ----- ---- - ----- ------------------- ----- ---- - ----------- ------- - --------------- -- ---- ---------------- - ----- ----------------- - - --- ------- -- - ---- -- ------------------- --- --------- - ----------------------- --- ----------------- - - --- --------------- -- --- -- - ---- - ----------------- - ----------------- - - ---- - ------------------- - ---- ----------------- - - ------ ----- --- ------ -- - ------ -------- ----------------- - ------- -------- - --- ------------------- ------- -- ---- ---------- ----- ------------ ----- ---- ---
在这个新的代码中,我们使用了 DELETE 请求来删除用户数据,使用 splice
方法将指定 ID 的元素从数组中删除。然后,我们将返回一个包含删除用户 ID 的 JSON 响应。
现在我们可以使用以下命令来测试我们的 /users/:id
路由:
curl -X DELETE http://localhost:8000/users/1
如果一切顺利,你应该可以看到以下的 JSON 响应:
{ "id": 1 }
结论
在本文中,我们已经介绍了如何在 Deno 中使用 Express.js 构建一个简单的 RESTful API。我们涵盖了多个功能,包括查询所有用户、查询特定用户、创建用户、更新用户和删除用户。我们提供了详细的教程和示例代码,希望能够帮助你更好地理解如何在 Deno 中使用 Express.js。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66fbb96a44713626016126b8