在现代的 Web 开发中,使用 Api 服务器来实现前后端的数据交互已经成为了一种非常流行和常见的方式。而使用 Deno 和 Strapi 来构建 Api 服务器,则能够让您的开发经验更快、更高效、更加灵活。本文将介绍如何在 Deno 环境中使用 Strapi 来搭建 Api 服务器,并给出相应的示例代码和实际案例分析。
简介
Deno 是一种基于 JavaScript 和 TypeScript 的新型运行环境,由 Node.js 的创始人 Ryan Dahl 开发。与 Node.js 相比,Deno 具备了更好的安全性、更高的性能、更严格的模块化等优势,所以越来越多的开发者开始选择使用 Deno 来进行开发。而 Strapi 则是一种流行的开源 CMS(内容管理系统),可以帮助开发者快速构建出各种类型的 Api 服务器。使用 Deno 和 Strapi 可以让您的开发更加灵活和高效。
安装和配置 Strapi
安装
在使用 Strapi 之前,需要先进行安装,在终端输入以下命令即可:
$ npm install strapi@alpha -g
配置
安装完成后,需要在项目文件夹中使用 Strapi 命令进行配置。在终端中使用以下命令:
$ strapi new myproject
其中,myproject 为您项目的名称。在执行这个命令之后,Strapi 将会在 myproject 文件夹下安装所需的依赖,并会提示您选择使用哪一种数据库进行配置。这里我们选择使用 SQLite 数据库进行配置(国内用户也可以选择清华镜像等加速下载):
// javascriptcn.com 代码示例 ? Choose your installation type Custom (manual settings) ? Choose your main database: SQLite ? Database name: (myproject) ? Host: ? Port: ? Username: ? Password: ? Enable SSL connection: ? Database name: (myproject) ? Enable SSL connection: (y/N)
编写和启动 Api 服务器
在安装和配置完 Strapi 之后,我们可以开始编写和启动 Api 服务器了。
编写 Api
在 myproject 文件夹下,可以找到一个名为 api 的文件夹,可以在其中创建各种类型的 Api,包括用户注册、登录、记录查询等等。下面我们以创建一个简单的登录 Api 为例:
首先,在 myproject/api 文件夹下创建一个名为 auth 的文件夹,并在其中创建一个名为 login 的文件夹,以及一个名为 config 的文件夹。在 login 文件夹中,创建名为 controllers.js 的文件,并在其中编写如下代码:
// javascriptcn.com 代码示例 "use strict"; module.exports = { async login(ctx) { const email = ctx.request.body.email; const password = ctx.request.body.password; // TODO: 检查邮箱和密码是否正确 // 如果邮箱和密码正确,则生成 token 并返回给客户端 // ... ctx.send({ token: 'xxxxx' }); } };
这里我们通过接收客户端发来的请求体中,判断 email 和 password 是否正确,并返回生成的 token。
接着,在 login 文件夹中,创建名为 routes.json 的文件,并在其中编写如下代码:
// javascriptcn.com 代码示例 { "routes": [ { "method": "POST", "path": "/login", "handler": "login.login", "config": { "policies": [] } } ] }
这里我们定义了一个路径为 /login 的路由,并指定其方法为 POST,handler 为 login.login,表示使用 login 文件夹中定义的 controllers.js 中的 login 方法来处理该请求。
最后,在 config 文件夹中创建名为 policies.js 的文件,并在其中编写如下代码:
// javascriptcn.com 代码示例 module.exports = { async policies(ctx, next) { // TODO: 检查用户的 token 是否正确 // 如果 token 正确,请求下一步处理 // 如果 token 不正确,返回错误 // ... await next(); } };
通过配置 policies,可以在每个请求之前进行 token 校验等其他操作。
启动 Strapi 服务器
在完成 Api 的编写后,我们可以使用以下命令来启动 Strapi 服务器:
$ strapi start
实例分析
下面我们以实际案例来介绍如何在 Deno 中使用 Strapi 来搭建 Api 服务器。
创建项目
首先,在商城项目中,创建一个名为 serverless 的文件夹,并在其中创建名为 myproject 的文件夹:
$ mkdir serverless $ cd serverless $ mkdir myproject $ cd myproject
在 myproject 文件夹中,安装 Strapi 以及其他所需的依赖:
$ npm install strapi@alpha dotenv
其中,dotenv 用于读取并设置环境变量。
配置 Strapi
在 myproject 文件夹中,使用 Strapi 命令进行配置:
$ npx strapi new myserver --dbclient=sqlite
其中,myserver 为服务器名称,--dbclient=sqlite 表示使用 SQLite 数据库进行配置。需要注意的是,在使用 Deno 环境时,Strapi 可能会由于如下依赖库而出现无法启动的问题:
- sharp
- sqlite3
- bcrypt
这时候需要自行手动安装这些依赖。
编写 Api
在 myserver/api 文件夹下,创建 auth/login 目录,其中 auth 目录负责身份认证,login 目录则定义登录相关的路由和控制器。
在 auth/login 目录下,创建 controllers.js ,并在其中编写登录逻辑:
// javascriptcn.com 代码示例 module.exports = { async login(ctx) { const email = ctx.request.body.email; const password = ctx.request.body.password; // TODO: 根据邮箱和密码查找用户 // 如果找到了该用户,则生成 token 并返回给客户端 // 如果未找到该用户,则返回错误信息给客户端 // ... ctx.send({ token: 'xxxxx' }); } };
接着,在 auth/login 目录下,创建 roles.json ,用于规定用户角色:
// javascriptcn.com 代码示例 { "permissions": [ { "action": "login", "subject": "auth/login" } ], "rolename": "authenticated", "description": "Users that have been authenticated" }
最后,在 auth/login 目录下,创建 routes.json 文件,用于规定登录相关的路由:
// javascriptcn.com 代码示例 { "routes": [ { "method": "POST", "path": "/login", "handler": "login.login", "config": { "policies": [] } } ] }
启动服务器
在配置完 Strapi 并编写完 Api 之后,我们可以使用以下代码在 Deno 环境中启动 Strapi 服务器:
import { config } from "https://deno.land/x/dotenv/mod.ts"; import strapi from "https://cdn.skypack.dev/strapi"; const port = parseInt(config.STRAPI_PORT); const { default: strapi } = await import("strapi"); strapi().start();
在启动服务器前,需要在 .env 文件中设置相应的环境变量:
STRAPI_PORT=1337
这里使用 Deno 库 dotenv 来读取并设置环境变量。启动服务器后,即可使用 Postman 等测试工具来测试您的 Api。
总结
在本文中,我们通过介绍如何在 Deno 中使用 Strapi 来构建 Api 服务器,详细地介绍了 Strapi 的安装和配置、编写 Api 以及启动服务器等步骤,并且给出了相关示例代码和实际案例分析。希望本文能够让更多的开发者能够更好地使用 Deno 和 Strapi 来进行 Api 服务器开发,并夯实自己的前端技能和经验。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654b18467d4982a6eb50f256