RESTful API 是现在 Web 应用程序中的一种主流开发方式,其简单直观的设计哲学和与 Web 文件资源的一致性特点使得其成为许多 Web 应用程序的首选开发方式之一。同时,Hapi.js 和 MongoDB 也成为了 Web 开发领域中的热门技术选型,它们各自有着特定的优点和适用场景。在本文中,我们将结合 Hapi.js 和 MongoDB 为例,详细介绍 RESTful API 的设计和实现,并给出实际的代码示例。
Hapi.js
Hapi.js 是一个现代化的 Web 应用程序框架,它是由 Walmart Labs 团队开发的,专为构建高度可扩展的应用程序而设计。与其他 Web 框架相比,Hapi.js 有许多优点,例如模块化结构、持续集成、自定义错误响应等。下面我们将介绍如何使用 Hapi.js 创建 RESTful API。
安装和初始化项目
首先,我们需要安装 Node.js 和 npm,以及 Hapi.js 的命令行工具 hapi-cli。我们可以使用以下命令来安装:
$ npm install -g hapi-cli
接着,我们可以创建一个新的项目,使用以下命令:
$ hapi new-project my-project
该命令将在当前目录下创建一个名为 my-project 的新项目。
编写 API
接下来,我们将创建一个简单的 RESTful API,该 API 可以获取、创建、更新和删除用户信息。我们先定义一个 users.js 文件作为数据存储层,并实现基本的 API 功能,代码如下:
let users = []; const Users = { getAll() { return users; }, create(user) { users.push(user); return user; }, update(id, user) { users[id] = user; return user; }, delete(id) { users.splice(id, 1); } }; module.exports = Users;
接着,我们将在 Hapi.js 中创建一个简单的路由,代码如下:
const Hapi = require('hapi'); const Users = require('./users'); const server = Hapi.server({ port: 3000, host: 'localhost', }); server.route({ method: 'GET', path: '/users', handler: (request, h) => { return Users.getAll(); } }); server.route({ method: 'POST', path: '/users', handler: (request, h) => { return Users.create(request.payload); } }); server.route({ method: 'PUT', path: '/users/{id}', handler: (request, h) => { return Users.update(request.params.id, request.payload); } }); server.route({ method: 'DELETE', path: '/users/{id}', handler: (request, h) => { Users.delete(request.params.id); return h.response().code(204); } }); async function start() { try { await server.start(); console.log(`Server running at: ${server.info.uri}`); } catch (err) { console.error(err); } } start();
在上述代码中,我们先启动了 Hapi.js 服务,并定义了四个路由,分别对应于获取所有用户信息、创建新用户、更新用户信息和删除用户信息这四个 API。
测试 API
我们可以使用 Postman 等工具来测试刚刚编写的 API。例如,我们可以使用以下命令来获取所有用户信息:
GET http://localhost:3000/users
我们可以使用以下命令来创建新用户:
POST http://localhost:3000/users Body { "name": "John Doe", "email": "johndoe@gmail.com", "age": 25 }
我们可以使用以下命令来更新用户信息:
PUT http://localhost:3000/users/0 Body { "name": "John Doe", "email": "johndoe@gmail.com", "age": 30 }
我们可以使用以下命令来删除用户信息:
DELETE http://localhost:3000/users/0
MongoDB
MongoDB 是一个开源的 NoSQL 数据库系统,它采用文档模型存储数据,具有高可扩展性、高性能和可靠性等特点。在 Hapi.js 中使用 MongoDB 可以大幅度简化数据存储层的代码实现。
安装和配置
首先,我们需要安装 MongoDB 数据库系统,具体安装方式可以参考官方文档。安装完成后,我们可以使用以下命令启动 MongoDB 服务:
$ mongod
接着,我们需要安装相关的 Node.js 模块,可以使用以下命令安装:
$ npm install mongodb
编写 API
接下来,我们将使用 MongoDB 替换原有的数据存储层。我们可以编写以下代码来初始化 MongoDB 数据库连接和数据模型:
const { MongoClient } = require('mongodb'); const uri = 'mongodb://localhost:27017'; const client = new MongoClient(uri, { useNewUrlParser: true }); let db; const init = async () => { try { await client.connect(); db = client.db('my-database'); console.log('Connected to MongoDB'); } catch (err) { console.error(err); } }; const Users = { getAll() { return db.collection('users').find().toArray(); }, create(user) { return db.collection('users').insertOne(user).then(res => res.ops[0]); }, update(id, user) { return db.collection('users').findOneAndUpdate({_id: id}, {$set: user}, {returnOriginal: false}).then(res => res.value); }, delete(id) { return db.collection('users').deleteOne({_id: id}); } }; module.exports = { init, Users, };
在上述代码中,我们使用了 MongoDB 的 Node.js 驱动程序,初始化了 MongoDB 数据库连接,并定义了一个名为 Users 的数据模型,该模型封装了 MongoDB 的查询、插入、更新和删除操作。我们还将 init 函数作为模块的导出项,以便在 Hapi.js 启动时连接 MongoDB 数据库。
接下来,我们将使用 async/await 模式在 Hapi.js 中引入 MongoDB 连接和数据模型,并修改之前的 API 代码:
const Hapi = require('hapi'); const { init, Users } = require('./db'); const server = Hapi.server({ port: 3000, host: 'localhost', }); server.route({ method: 'GET', path: '/users', handler: async (request, h) => { await init(); return Users.getAll(); } }); server.route({ method: 'POST', path: '/users', handler: async (request, h) => { await init(); return Users.create(request.payload); } }); server.route({ method: 'PUT', path: '/users/{id}', handler: async (request, h) => { await init(); return Users.update(request.params.id, request.payload); } }); server.route({ method: 'DELETE', path: '/users/{id}', handler: async (request, h) => { await init(); await Users.delete(request.params.id); return h.response().code(204); } }); async function start() { try { await server.start(); await init(); console.log(`Server running at: ${server.info.uri}`); } catch (err) { console.error(err); } } start();
在上述代码中,我们使用 async/await 模式在 Hapi.js 中引入 MongoDB 数据库连接和数据模型,并在每个路由处理函数中使用 await 关键字等待数据库初始化完成。我们还在 start 函数中使用 await 关键字等待数据库连接,以确保 Hapi.js 启动时 MongoDB 数据库已连接。
测试 API
我们可以使用 Postman 等工具来测试修改后的 API。例如,我们可以使用以下命令来获取所有用户信息:
GET http://localhost:3000/users
我们可以使用以下命令来创建新用户:
POST http://localhost:3000/users Body { "name": "John Doe", "email": "johndoe@gmail.com", "age": 25 }
我们可以使用以下命令来更新用户信息:
PUT http://localhost:3000/users/ObjectId("5e0a0a54a27d27217c0f3045") Body { "name": "John Doe", "email": "johndoe@gmail.com", "age": 30 }
我们可以使用以下命令来删除用户信息:
DELETE http://localhost:3000/users/ObjectId("5e0a0a54a27d27217c0f3045")
总结
在本篇文章中,我们介绍了 Hapi.js 和 MongoDB 的用法,并说明了如何在 Hapi.js 服务中实现 RESTful API 设计。RESTful API 是 Web 开发领域中的一项重要技术,在实际开发中经常被使用到。同时,Hapi.js 和 MongoDB 也是相对成熟的 Web 框架和数据库系统,它们都具有易用性和高可靠性的特点,可大幅度降低 Web 应用程序开发的难度和复杂度。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6594c590eb4cecbf2d90ad18