Node.js中结合第三方API使用查询参数实现搜索的代码问题排查
修复后的实现方案
你的代码存在几个关键问题,导致无法正确实现搜索和排序功能,下面是修正后的完整代码及说明:
原代码的问题点
- 错误设置了
multipart/form-data请求头:GET请求不需要这个头,反而可能干扰第三方API的响应处理,axios默认会正确处理JSON格式的响应。 - 混合使用
async/await和.then():这种写法会导致代码嵌套混乱,且无法捕获axios请求本身的异常。 - 误用
Array.find():该方法需要传入回调函数,而不是MongoDB风格的查询对象,$regex语法在这里不生效。 - 未实现
order参数的排序逻辑。 - 错误处理不完整:仅捕获了后续逻辑的错误,没有处理axios请求失败的情况。
修正后的代码
const express = require('express'); const axios = require('axios'); const router = express.Router(); router.get('', async (req, res) => { try { // 提取查询参数,order默认设为Asc const { name, order = 'Asc' } = req.query; // 请求第三方大学数据API const { data: universities } = await axios.get('http://universities.hipolabs.com/search'); // 处理名称搜索 let result = universities; if (name) { // 创建不区分大小写的正则表达式 const nameMatcher = new RegExp(name, 'i'); // 筛选出名称匹配的大学 result = universities.filter(uni => nameMatcher.test(uni.name)); } // 处理排序逻辑 result.sort((a, b) => { const nameA = a.name.toLowerCase(); const nameB = b.name.toLowerCase(); return order.toLowerCase() === 'asc' ? nameA.localeCompare(nameB) : nameB.localeCompare(nameA); }); // 返回处理后的结果 res.json({ status: 'Success', result: result }); } catch (err) { // 捕获所有异常并返回错误信息 res.status(500).json({ status: 'Error', message: err.message || '服务器处理失败' }); } }); module.exports = router;
关键功能说明
- 搜索功能:使用
Array.filter()结合正则表达式,实现不区分大小写的名称模糊匹配,只要大学名称包含查询的name参数内容就会被筛选出来。 - 排序功能:根据
order参数的值,对筛选后的结果按名称进行升序(Asc)或降序(Desc)排序,默认升序。 - 错误处理:用外层
try/catch捕获所有异常,包括axios请求失败、排序或筛选逻辑出错等情况,返回统一格式的错误响应。 - 请求优化:移除了多余的请求头,让axios自动处理响应格式,避免不必要的问题。
测试用例
- 搜索包含"Cairo"的大学并升序:
http://localhost/university?name=Cairo&order=Asc - 搜索包含"London"的大学并降序:
http://localhost/university?name=London&order=Desc - 不传入
name参数时返回所有大学(默认升序):http://localhost/university
内容的提问来源于stack exchange,提问作者Amanat
相关产品推荐
相关产品推荐

