查询字符串(Query String)是URL中问号(?)后面的部分,用于向服务器传递参数。在HAPI JS框架中,可以方便地访问这些参数来实现API的搜索和过滤功能。
在HAPI JS中,可以通过request.query
对象访问查询字符串参数:
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)}`;
}
});
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;
}
});
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;
}
});
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进行验证:
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;
// 实现搜索逻辑...
}
});
page
而不是p
或currentPage
问题1:查询参数未正确解析
原因:可能是URL编码问题或参数格式不正确
解决:确保参数正确编码,使用encodeURIComponent()
处理特殊字符
问题2:数字参数被当作字符串处理
原因:查询字符串中的所有值默认都是字符串
解决:手动转换为数字类型:const num = parseInt(request.query.num)
问题3:多值参数处理
解决:对于多值参数(如?color=red&color=blue
),使用数组处理:
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中处理查询字符串参数,实现强大的搜索和过滤功能。
没有搜到相关的文章