Hapi.js 是一个流行的 Node.js 框架,被广泛应用于企业级 Web 应用的开发中。它拥有丰富的功能和选项,并且易于扩展。在本文中,我们将探讨如何使用 Hapi.js 构建一个真正的 Web 服务,包括如何添加路由、使用插件、管理会话和验证用户等。
安装 Hapi.js
首先,我们需要在本地安装 Hapi.js。在终端中执行以下命令即可安装:
npm install hapi --save
这将在您的项目中安装 Hapi.js 并引入它所需的所有依赖项。
创建基本服务器
Hapi.js 的主要组成部分是服务器,用于处理 HTTP 请求并返回响应。在我们开始添加路由或其他功能之前,我们需要先创建一个基本的服务器。
创建一个新文件 server.js
,并输入以下内容:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ------ - --- ------------- ----- ------------ ----- ---- --- ----- ---- - ----- -- -- - ----- --------------- ------------------- ------- --- --------------------- -- -------
在这里,我们使用 require()
导入 Hapi.js 模块并创建一个新的服务器实例。host
属性指定我们希望服务器监听哪个主机名或 IP 地址,而 port
属性指定我们想要监听的端口号。在这个例子中,服务器将监听 localhost:3000
。 init()
函数用于启动服务器,并在控制台中打印服务器的地址。
在终端中运行以下命令:
node server.js
如果一切工作正常,则会在控制台中看到类似于以下输出:
Server running at: http://localhost:3000
您已经成功启动了 Hapi.js 服务器。
添加路由
路由是 Web 服务的主要组成部分之一。它们用于将传入的请求映射到指定的处理程序函数,并将响应发送回客户端。
在我们的示例中,让我们添加一个基本的路由,以便用户可以通过 /
路径向我们的服务器发出 GET 请求,并返回 Hello, world!
字符串。
将以下代码添加到 server.js
文件中:
server.route({ method: 'GET', path: '/', handler: (request, h) => { return 'Hello, world!'; } });
在这里,我们使用 server.route()
方法添加一个新的路由。 method
属性定义了该路由需要处理的请求类型,path
属性指定该路由需要匹配的 URL 路径。当客户端向匹配的路径发送请求时,handler
函数将被调用。它将带有包含有关请求的信息的 request
和 h
参数。在我们的示例中,服务器将返回 Hello, world!
字符串。
在终端中重新运行我们的服务器,然后在浏览器中访问 http://localhost:3000
。您应该能够看到浏览器中显示的 Hello, world!
字符串。
使用插件
Hapi.js 插件可用于扩展服务器的功能。有些插件是官方支持的,而其他插件则是社区驱动的。在我们的示例中,让我们添加 hapi-auth-cookie 插件,以便支持基于 cookie 的身份验证。
首先,我们需要将该插件添加到我们的 package.json
文件中:
{ "dependencies": { "hapi-auth-cookie": "^9.1.0" } }
然后安装插件:
npm install
现在我们可以将插件添加到我们的服务器中:
-- -------------------- ---- ------- ----- ---- - ---------------- ----- ----- - ----------------- ----- ------ - ------------------ ----- -------------- - ---------------------------- ----- ------ - --- ------------- ----- ------------ ----- ---- --- ----- ---- - ----- -- -- - -- ---- ----- ----------------------- ------- ----------------- -- ------ ------------------------------- --------- - ------- - ----- ------ ----- ---- --------- ----------------------------------- --------- ------ ----------- --------- ------------- ----- ------------- ----- --------- -------- -- - -- ------------- ----- ---- - ----- ---------------------------------- ------------------ -- ------- - ------ - ------ ----- -- - -- -------------- ------ - ------ ----- ------------ ---- -- - - --- -- ---- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------- -------- - --- ----- --------------- ------------------- ------- --- --------------------- -- -------
在这里,我们首先使用 require()
导入我们需要的插件,然后使用 await server.register()
方法将它们注册到服务器中。server.auth.strategy()
方法为默认的路由配置添加了一个名为 session
的策略。在本例中,我们使用基于 cookie 的身份验证机制。定义了 cookie
属性,包含了有关 cookie 的详细信息,包括要使用的 cookie 名称、路径、密码、是否安全等。
validateFunc
方法用于检查用户是否存在于数据库中,并返回验证结果。在我们的示例中,我们模拟了一个 User
类,用于检查传递的 session.id
和 session.password
是否有效。
管理会话
使用 hapi-auth-cookie
插件,我们可以轻松地在 Hapi.js 中管理会话。会话是在服务器和 Web 客户端之间建立的一段连接,允许客户端与服务器交换有关特定用户的信息。
在我们的示例中,让我们添加两个新的路由,以允许用户登录和注销。
-- -------------------- ---- ------- -------------- ------- ------ ----- --------- -------- --------- -- -- - ------ - ----- ------------- ---------------- ----------------------------------- ----------- --------------- -------- ----------------------------------- --------------- --------------- -------- ----------- ------------- ------------- -------- ------- -- -- -------- - ----- ----- - --- -------------- ------- ------- ----- --------- -------- --------- -- -- - ------------------------ --- ---------- --------- ---------- --- ------ ---------------- -- -------- - ----- ----- - --- -------------- ------- ------ ----- ---------- -------- --------- -- -- - --------------------------- ------ ---------------- -- -------- - ----- --------- - ---
在这里,我们首先添加了 /login
路径的 GET 路由,它将呈现一个简单的 HTML 表单,其中包含用户名和密码输入框。当用户提交表单时,它将使用 POST 路由来检查用户名和密码是否正确,并在通过验证时在客户端中设置一个名为 sid
的 cookie。
然后,我们添加了 /logout
路径的 GET 路由,它将清除以前设置的 cookie 并重定向到首页。
请注意,我们在 /login
和 /logout
路径的路由中都使用了 options.auth
属性。在 Hapi.js 中,此属性用于指定路由是否需要身份验证。 auth: false
表示不需要身份验证,而 auth: 'session'
表示需要身份验证。
在终端中重新启动 Web 服务后,您现在可以执行 /login
和 /logout
路径,以管理会话和用户身份验证。
验证用户
Hapi.js 允许我们轻松地实现用户身份验证。在我们的示例中,让我们创建一个名为 User
的类,以模拟一个真实的用户。
-- -------------------- ---- ------- ----- ---- - --------------- --------- - ------- - -------------- ------------- - -------------------- - ------ ----- --------------------- --------- - -- -------------- -- ------------- -- --- --- --------- -- -------- --- ----------- - ------ --- -------- ---------- - ------ ----- - -
在这里,我们使用 class
创建一个 User 类。它有两个属性:id
和 password
,以及一个名为 findByCredentials
的静态方法,该方法用于检查传递的 ID 和密码是否有效。
在我们的示例中,findByCredentials
方法只是检查传递的值是否与预定义的值匹配。在实际的 Web 服务中,您应该使用数据库或其他存储机制来检查用户的凭据是否有效。
现在,我们已经创建了一个 User 类,让我们更新 /login
安装程序,以使用 User.findByCredentials
方法来检查传递的用户名和密码是否正确。
-- -------------------- ---- ------- -------------- ------- ------- ----- --------- -------- ----- --------- -- -- - ----- - --------- -------- - - ---------------- -- ------ ----- ---- - ----- -------------------------------- ---------- -- ------- - ------ --------------- - ------ -------- ------------------ --- - -- - ------ ----- -- --- ------------------------ --- -------- --------- ------------- --- -- ------ ------ ---------------- -- -------- - ----- ----- - ---
在这里,我们首先从请求有效载荷中提取 username
和 password
的值。然后,我们使用 User.findByCredentials
方法检查传递的凭据是否有效。如果它们有效,则在 cookie 中设置 user.id
和 user.password
的值。
在客户端的下一页加载时,request.auth.credentials
对象将包含有关当前经过身份验证的用户的信息。
结论
通过使用 Hapi.js,我们可以轻松创建功能丰富且易于扩展的 Web 服务。在本文中,我们探讨了如何安装 Hapi.js、添加路由、使用插件、管理会话和验证用户等技术。我们希望这些技术对于您的下一个 Web 服务项目非常有用。在我们的示例中,您可以通过访问 http://localhost:3000
来检查我们的服务器。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670a124bd91dce0dc87e5cac