RESTful API 是一种基于 HTTP 协议的 Web API 设计风格,它以资源为中心,通过 HTTP 方法来对资源进行增删改查等操作。在前端开发中,我们经常需要使用 RESTful API 与后台服务器进行数据交互。本文将介绍如何使用 Hapi.js 实现 RESTful API 的搭建,包括路由配置、数据库操作、错误处理等方面的内容。
安装 Hapi.js
在开始之前,我们需要先安装 Hapi.js。打开终端,执行下面的命令:
npm init -y npm install hapi
使用 Hapi.js 搭建 RESTful API
路由配置
Hapi.js 支持通过 server.route()
方法来进行路由配置。在我们的 RESTful API 中,每个资源都应该有一个对应的路由,例如 /users
、/users/{id}
等。我们可以使用 method
、path
、handler
等选项来定义路由的 HTTP 方法、URL、处理函数等信息。
// javascriptcn.com 代码示例 const Hapi = require('hapi'); const server = Hapi.server({ port: 3000, host: 'localhost', }); const users = [ { id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }, ]; server.route({ method: 'GET', path: '/users', handler: function (request, h) { return h.response(users); }, }); server.route({ method: 'GET', path: '/users/{id}', handler: function (request, h) { const id = parseInt(request.params.id); const user = users.find(user => user.id === id); if (!user) { return h.response({ error: 'User not found' }).code(404); } return h.response(user); }, });
上面的代码中,我们创建了一个基础的 Hapi 服务器,并定义了两个路由:/users
和 /users/{id}
,分别用于获取所有用户和获取单个用户。handler
函数通过返回 h.response()
方法来返回响应结果,并在 GET /users/{id}
中处理了可能出现的用户不存在情况。
数据库操作
在实际开发中,我们通常需要将数据存储在数据库中。Hapi.js 并不限制我们使用什么样的数据库,在本篇文章中我们选择使用 MongoDB。
首先,我们需要安装 mongodb
和 hapi-mongodb
这两个依赖。
npm install mongodb hapi-mongodb
然后,我们需要在服务器启动时连接数据库。我们可以使用 server.register()
方法来注册官方的 hapi-mongodb
插件,然后在回调函数中获取 mongodb
客户端并连接数据库。
// javascriptcn.com 代码示例 const Hapi = require('hapi'); const MongoClient = require('mongodb').MongoClient; const MongoBaseUrl = 'mongodb://localhost:27017/mydb'; const server = Hapi.server({ port: 3000, host: 'localhost', }); async function start() { try { await server.register({ plugin: require('hapi-mongodb'), options: { url: MongoBaseUrl, settings: { useNewUrlParser: true, }, decorate: true, }, }); console.log('Connected to MongoDB'); await server.start(); console.log(`Server running at: ${server.info.uri}`); } catch (err) { console.log(err); } } start();
连接成功后,我们也需要修改之前的路由处理函数,将其从数组直接返回改为从数据库中获取。下面是获取所有用户和获取单个用户的示例代码。
// javascriptcn.com 代码示例 server.route({ method: 'GET', path: '/users', handler: async function (request, h) { const db = request.mongo.db; const collection = db.collection('users'); const result = await collection.find().toArray(); return h.response(result); }, }); server.route({ method: 'GET', path: '/users/{id}', handler: async function (request, h) { const id = parseInt(request.params.id); const db = request.mongo.db; const collection = db.collection('users'); const user = await collection.findOne({ id: id }); if (!user) { return h.response({ error: 'User not found' }).code(404); } return h.response(user); }, });
上面的代码中,我们使用 request.mongo.db
来获取数据库连接,然后使用 collection()
方法来获取集合。通过 find()
、findOne()
等方法可以进行查询操作。值得注意的是,在 hapi-mongodb
插件中,返回的是一个 Promise,我们需要使用 async/await
或 .then()
来处理结果。
错误处理
在实际开发中,我们需要对响应结果进行错误处理,以增强系统的鲁棒性。Hapi.js 提供了多种方式来处理错误,例如内置的 Boom 库、throw 抛出异常、自定义插件等。在本篇文章中,我们演示使用内置的 Boom 库来处理错误。
首先,我们需要在路由处理函数中检查错误,并使用 Boom 创建错误响应。下面是获取单个用户时发生错误时的示例代码。
// javascriptcn.com 代码示例 const Boom = require('boom'); server.route({ method: 'GET', path: '/users/{id}', handler: async function (request, h) { const id = parseInt(request.params.id); const db = request.mongo.db; const collection = db.collection('users'); try { const user = await collection.findOne({ id: id }); if (!user) { throw Boom.notFound('User not found'); } return h.response(user); } catch (err) { throw Boom.boomify(err); } }, });
上面的代码中,我们使用 throw Boom.notFound()
创建一个 404 错误响应,然后使用 throw Boom.boomify()
将异常转化为 Boom 错误。
然后,我们需要在服务器的 onPreResponse
钩子中拦截错误响应,并将其转化为 JSON 格式的响应。下面是创建服务器时增加 onPreResponse
钩子的示例代码。
server.ext('onPreResponse', function (request, h) { const response = request.response; if (!response.isBoom) { return h.continue; } const { statusCode, payload } = response.output; return h.response({ code: statusCode, message: payload.message }).code(statusCode); });
上面的代码中,我们使用 server.ext()
方法来注册 onPreResponse
钩子,并在钩子函数中判断当前响应是否为错误响应,然后将其转化为 JSON 格式的响应。
总结
通过本文的介绍,我们了解了如何使用 Hapi.js 来搭建 RESTful API,并演示了路由配置、数据库操作、错误处理等方面的内容。Hapi.js 作为一款快速、可靠、可扩展的 Node.js Web 框架,可以帮助我们更轻松地构建高质量的 Web 应用。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653740d07d4982a6ebfb50a5