首页
学习
活动
专区
圈层
工具
发布

如何访问查询字符串参数,使用HAPI JS对API进行搜索/过滤?

使用HAPI JS访问查询字符串参数及实现搜索/过滤

基础概念

查询字符串(Query String)是URL中问号(?)后面的部分,用于向服务器传递参数。在HAPI JS框架中,可以方便地访问这些参数来实现API的搜索和过滤功能。

访问查询字符串参数

在HAPI JS中,可以通过request.query对象访问查询字符串参数:

代码语言:txt
复制
server.route({
    method: 'GET',
    path: '/users',
    handler: (request, h) => {
        // 访问所有查询参数
        const queryParams = request.query;
        
        // 访问特定参数
        const name = request.query.name;
        const age = request.query.age;
        
        return `Received query params: ${JSON.stringify(queryParams)}`;
    }
});

实现搜索/过滤功能

1. 基本搜索实现

代码语言:txt
复制
const users = [
    { id: 1, name: 'Alice', age: 25 },
    { id: 2, name: 'Bob', age: 30 },
    { id: 3, name: 'Charlie', age: 35 }
];

server.route({
    method: 'GET',
    path: '/users',
    handler: (request, h) => {
        let results = [...users];
        
        // 按名称过滤
        if (request.query.name) {
            results = results.filter(user => 
                user.name.toLowerCase().includes(request.query.name.toLowerCase())
            );
        }
        
        // 按年龄过滤
        if (request.query.age) {
            results = results.filter(user => 
                user.age === parseInt(request.query.age)
            );
        }
        
        return results;
    }
});

2. 高级过滤实现(支持多个条件)

代码语言:txt
复制
server.route({
    method: 'GET',
    path: '/products',
    handler: (request, h) => {
        const products = getProductsFromDatabase(); // 假设从数据库获取
        
        let filteredProducts = [...products];
        
        // 动态构建过滤条件
        const filters = request.query;
        
        if (Object.keys(filters).length > 0) {
            filteredProducts = filteredProducts.filter(product => {
                return Object.entries(filters).every(([key, value]) => {
                    // 处理数字比较(如 price_gt=100)
                    if (key.endsWith('_gt')) {
                        const field = key.replace('_gt', '');
                        return product[field] > parseFloat(value);
                    }
                    if (key.endsWith('_lt')) {
                        const field = key.replace('_lt', '');
                        return product[field] < parseFloat(value);
                    }
                    
                    // 处理字符串包含
                    return String(product[key]).toLowerCase().includes(String(value).toLowerCase());
                });
            });
        }
        
        return filteredProducts;
    }
});

3. 分页实现

代码语言:txt
复制
server.route({
    method: 'GET',
    path: '/articles',
    handler: (request, h) => {
        const articles = getArticlesFromDatabase(); // 假设从数据库获取
        const page = parseInt(request.query.page) || 1;
        const limit = parseInt(request.query.limit) || 10;
        
        const startIndex = (page - 1) * limit;
        const endIndex = page * limit;
        
        const paginatedArticles = articles.slice(startIndex, endIndex);
        
        return {
            data: paginatedArticles,
            pagination: {
                currentPage: page,
                totalPages: Math.ceil(articles.length / limit),
                totalItems: articles.length
            }
        };
    }
});

参数验证

HAPI提供了强大的参数验证功能,可以使用Joi进行验证:

代码语言:txt
复制
const Joi = require('joi');

server.route({
    method: 'GET',
    path: '/search',
    options: {
        validate: {
            query: Joi.object({
                q: Joi.string().min(3).max(100).required(),
                page: Joi.number().integer().min(1).default(1),
                limit: Joi.number().integer().min(1).max(100).default(10),
                sort: Joi.string().valid('asc', 'desc').default('asc')
            })
        }
    },
    handler: (request, h) => {
        // 参数已经通过验证
        const { q, page, limit, sort } = request.query;
        
        // 实现搜索逻辑...
    }
});

最佳实践

  1. 参数命名一致性:保持查询参数命名一致,如使用page而不是pcurrentPage
  2. 默认值处理:为常用参数提供合理的默认值
  3. 文档化:使用Swagger等工具文档化你的API参数
  4. 安全性:验证所有输入参数,防止SQL注入等攻击
  5. 性能考虑:对于大型数据集,考虑在数据库层面实现过滤而非内存中

常见问题解决

问题1:查询参数未正确解析

原因:可能是URL编码问题或参数格式不正确 解决:确保参数正确编码,使用encodeURIComponent()处理特殊字符

问题2:数字参数被当作字符串处理

原因:查询字符串中的所有值默认都是字符串 解决:手动转换为数字类型:const num = parseInt(request.query.num)

问题3:多值参数处理

解决:对于多值参数(如?color=red&color=blue),使用数组处理:

代码语言:txt
复制
server.route({
    method: 'GET',
    path: '/products',
    options: {
        validate: {
            query: Joi.object({
                color: Joi.array().items(Joi.string()).single()
            })
        }
    },
    handler: (request, h) => {
        const colors = request.query.color; // 自动转为数组
        // ...
    }
});

通过以上方法,你可以有效地在HAPI JS中处理查询字符串参数,实现强大的搜索和过滤功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的文章

领券