Node.js获取URL参数报错Cannot read property 'get' of undefined
报错根因
你代码里的full_url是手动拼接的普通字符串类型,不是Node.js url 模块解析生成的URL实例对象,原生字符串不存在searchParams属性,所以访问full_url.searchParams得到的就是undefined,后续对undefined调用.get()方法自然会抛出类型错误。
另外你的代码里还存在3处会直接触发运行时错误的低级问题:
- 定义的变量名为
full_url,打印时写成了大小驼峰的fullUrl,变量名不匹配 - 已经注释掉了
start、end变量的定义代码,下方直接打印两个不存在的变量会触发引用错误,且start还拼错成了sart - 向第三方API发请求时,直接把
req.query.params拼到接口路径末尾是错误逻辑,GET参数不属于路径的一部分,硬拼会导致请求404。
修复方法
有两种实现思路,优先选第一种更符合Express开发习惯:
- 直接使用Express框架内置解析好的
req.query对象获取URL参数,不需要手动引入url模块做解析。客户端GET请求传的所有查询参数都会被Express自动解析成键值对存在这个对象里,比如要拿start和end参数,直接读req.query.start、req.query.end即可。 - 如果一定要手动用url模块解析,必须先把拼接好的URL字符串传入
new URL()构造函数生成URL实例,才能访问实例上的searchParams属性,正确写法:
const full_url = new URL(`${req.protocol}://${req.get('host')}${req.originalUrl}`); const search_params = full_url.searchParams; // 此时search_params是URLSearchParams实例,可以正常调用.get()方法 const start = search_params.get('start') const end = search_params.get('end')
- 调用第三方API时,GET查询参数不要拼在路径后面,放到axios配置的
params字段里即可,axios会自动完成参数拼接和编码。
修正后的完整代码
const axios = require('axios'); const router = require('express').Router(); require('dotenv').config(); const bamboo_api_key = process.env.BAMBOO_API_KEY; const config = { headers: { 'Accept':'application/json' }, // 第三方接口鉴权也可以直接放到auth配置里,不用硬拼到URL里 auth: { username: bamboo_api_key, password: 'x' } }; router.get('/bamboo/absencees', (req, res) => { // 直接从req.query拿参数,不需要手动解析URL const { start, end } = req.query; console.log("请求参数start, end: ", start, end); axios.get('https://api.bamboohr.com/api/gateway.php/velocitypartners/v1/time_off/whos_out/', { ...config, params: { // 把需要传给第三方的参数放到这里,按需传即可 start, end } }) .then((response) => { console.log('第三方接口响应成功'); res.send(response.data) }) .catch(error => { console.log('请求第三方接口出错: ', error) res.status(500).send({msg: '服务异常'}) }); }) module.exports = router;
注意:拿到用户输入的URL参数后,最好先做参数合法性校验,比如判断start、end是否为空、是否是合法的日期格式,再传给第三方接口,避免无效请求。
内容的提问来源于stack exchange,提问作者Michael Stubbs
相关产品推荐
相关产品推荐

