You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:39:18