在 Web 开发中,数据的搜索是一个非常常见的需求。然而,很多时候我们需要对自定义字段进行搜索,如何实现呢?本文将介绍如何使用 Fastify 和 MongoDB 实现自定义字段搜索,并带你深入理解其中的原理。
准备工作
为了跟进本文的内容,你应该有以下的基础知识:
- Node.js 和 npm 的使用
- JavaScript 语言基础
- Fastify 和 MongoDB 基础
如果你不熟悉这些知识,请先自学这些内容。
示例场景
假设我们有一个产品信息表,其中每个产品都有以下字段:
- 商品名称(name)
- 商品描述(description)
- 价格(price)
- 制造商(manufacturer)
- 分类(category)
- 标签(tag)
产品信息存储在 MongoDB 数据库中,我们想要实现对产品信息的搜索功能。我们可以允许用户搜索任意的字段,如何实现呢?
1. 创建项目
首先创建一个新的 Node.js 项目,在命令行输入:
mkdir custom-search cd custom-search npm init -y
2. 安装依赖
使用 npm 安装以下依赖:
npm i --save fastify fastify-cors fastify-rate-limit fastify-swagger fastify-mongodb
这些依赖包括:
- fastify:我们要使用的 Web 框架
- fastify-cors:允许在不同域之间进行跨域资源共享
- fastify-rate-limit:限制每个客户端进行请求的速率
- fastify-swagger:自动生成 API 文档
- fastify-mongodb:使用 MongoDB 数据库
3. 连接数据库
在 index.js
中引入需要的依赖:
const fastify = require('fastify')({ logger: true }) const cors = require('fastify-cors') const rateLimit = require('fastify-rate-limit') const swagger = require('fastify-swagger') const mongodb = require('fastify-mongodb')
定义 MongoDB 数据库的连接 URI:
const mongoURI = 'mongodb://localhost/custom-search'
插件注册顺序很重要。我们需要先注册 fastify-mongodb
插件,然后才能将 MongoDB 实例注入到它之后注册的插件中。
-- -------------------- ---- ------- ------------------------- - ---- --------- ---------------- ----- -- ----- -- - -- ----- - ---------------------- --------------- - ------------------------- ----------- --
4. 创建路由
监听 /api/search
的 GET 请求,并根据请求参数进行搜索。一个简单的实现方法是在路由处理函数中接收请求并在 MongoDB 中查询。
fastify.get('/api/search', async (request, reply) => { const { query } = request const collection = fastify.mongo.db.collection('products') const results = await collection.find(query).toArray() reply.send(results) })
但这个问题是如果是空查询,那么就会查询所有的数据。我们需要严格的控制查询字段。所以,我们创建自定义路由处理函数。
-- -------------------- ---- ------- ----- ------------- - ----- --------- ------ -- - ----- - ----- - - ------- -- ------------ ----- ------ - ----------------------------------- ------- -- ----- --- --- -- ---------------- -- -------------- --- -- - ----- ---------- - --------------------------------------- ----- ------- - ----- --------------------------- ------ ------- - -- ----------- ----- ----- ------ - --------- ----- ---------- - --------------------------------------- ----- ------- - ----- ----------------- ------ - ------- --- ------------- ---- - ------------ ------ ------- -
5. 安全考虑
我们需要对请求参数进行一些安全性考虑:
- 避免空值字段
- 避免注入攻击
- 限制请求速率
实现步骤如下:
避免空值字段
添加请求参数验证,确保至少在一个字段上有值:
-- -------------------- ---- ------- ------- - ----- --------- ----------- - ----- - ----- --------- --------- ----- ---------- - -- ------------ - ----- --------- --------- ----- ---------- - -- ------ - ----- --------- --------- ----- -------- - -- ------------- - ----- --------- --------- ----- ---------- - -- --------- - ----- --------- --------- ----- ---------- - -- ---- - ----- --------- --------- ----- ---------- - -- -- --------- -------- -------------- -------- --------------- ----------- ------ -
避免注入攻击
在查询字段中输入的值应该是纯字符串,如 productName
或 productDescription
。我们可以使用以下方式来避免注入攻击:
const safeKey = key.replace('$', '') // 必须去掉 MongoDB 的运算符 const safeValue = value.replace(/[^a-zA-Z0-9]+/g, '')
限制请求速率
我们需要限制每个客户端在一定时间内进行的请求速率。我们使用 fastify-rate-limit
插件来实现。
fastify.register(rateLimit, { max: 10, timeWindow: '1 minute' })
6. 自动生成文档
使用 fastify-swagger
插件自动生成 API 文档。我们需要在路由处理函数中添加文档信息:
-- -------------------- ---- ------- ----- ------------- - - ------- - ------------ ------------- -- ----------- ------------------------------------- - --------------- ------- ------ ---- -------------- -------- -------------- -------- - ----------------- ------- - -------- ------- ---------- ------------ ------- -------- -- --- -------- ------------------------ - -- --
在启动服务之前,我们需要添加以下代码来启用作为API的查找:
-- -------------------- ---- ------- ------------------------- - ------------ -------- -------- - ----- - ------ ------- ------ ----- ------------ ------- ------ --- --------------- -------- -------- -- ------------- - ---- --------------------- ------------ ----- ---- ---- ------ -- --------- --------------------- --------- --------------------- -- ------------ ----- --
7. 启动服务
最后,在 index.js
中添加以下代码来启动服务:
-- -------------------- ---- ------- ----- ----- - ----- -- -- - --- - ----- -------------------- ----------------- ------------------------ --------- -- ---------------------------------- - ----- ----- - ---------------------- --------------- - - -------
现在启动服务,在浏览器中打开 http://localhost:3000/docs
可以看到文档。
总结
在本文中,我们介绍了使用 Fastify 和 MongoDB 实现自定义字段搜索的方法,包括:创建项目,安装依赖,连接数据库,创建路由,安全考虑和自动生成文档。这些技术在实际项目中非常有用,并可以帮助你更好地理解 Web 开发中的相关知识。完整的示例代码可以在 Github 上下载。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649dc36348841e9894a6f49d