Express不同路径复用相同逻辑时名称查询无返回问题排查
问题定位
你的/pokemons/name/:pokeName接口查不到数据的核心原因是错误复用了id接口的类型转换逻辑,对字符串类型的名称参数做了数字强转:
- id接口中
item.id === +id的写法是正确的:路由参数默认是字符串类型,用一元加号+把字符串id转成数字,刚好和数据源中存储的数字类型id匹配,所以可以正常查询 - name接口中你写了
item.name === +pokeName,这里的+pokeName会把传入的宝可梦名称(字符串)强制转成数字,非纯数字的名称转换结果都是NaN,拿NaN和数据源里的字符串类型name字段做全等比较永远不会成立,自然查不到任何结果
修复方案
移除name查询逻辑里多余的+强转即可,建议额外增加大小写兼容,避免用户传入大小写和数据源不一致时匹配失败:
app.get('/pokemons/name/:pokeName', async (req, res) => { const { pokeName } = req.params // 移除错误的数字强转,增加大小写不敏感匹配 const pokemon = allPokemons.pokemon.find((item) => item.name.toLowerCase() === pokeName.toLowerCase()) try { if (!pokemon) { res.status(404).send('No pokemon found with this name') } else { res.json(pokemon) } } catch (error) { res.status(400).json({ error: 'Not found' }) } })
额外注意
- 所有从路由、请求体、查询参数拿到的值默认都是字符串类型,做类型转换前必须先确认目标匹配字段的实际类型,不要直接照搬其他接口的逻辑
- 字符串匹配场景优先考虑做大小写兼容,能大幅降低用户查询时的无意义报错
内容的提问来源于stack exchange,提问作者Rijad
相关产品推荐
相关产品推荐

