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

Node.js中如何保留GET查询字符串开头的±符号

解决Node.js GET请求中查询参数正负号被移除的问题

问题原因

这不是Node.js的bug,而是符合URL编码规范的行为:在URL查询字符串中,+被定义为空格的替代字符。当你传递time_zone=+02:00时,解析器会自动把+转换成空格,最终得到 02:00。

解决方案

方案一:前端正确编码参数(推荐)

发起请求前,对包含+的参数值做URL编码,把+替换为对应的编码%2B。比如用JavaScript的encodeURIComponent方法:

const timeZone = "+02:00";
const encodedTimeZone = encodeURIComponent(timeZone); // 得到 "%2B02%3A00"
// 拼接成请求URL:`/api/xxx?time_zone=${encodedTimeZone}`

后端通过req.query.time_zone就能直接获取到正确的+02:00。

方案二:后端手动修正解析逻辑(适用于前端无法修改的场景)

如果前端没办法调整传参方式,后端可以直接读取原始URL的查询部分,手动处理+符号:

方法1:使用URLSearchParams预处理
const url = require('url');

// 提取URL中的查询字符串部分
const queryStr = url.parse(req.url).query;
if (queryStr) {
  // 把所有+替换为%2B,再解析
  const correctedQuery = queryStr.replace(/\+/g, '%2B');
  const params = new URLSearchParams(correctedQuery);
  const time_zone = params.get('time_zone'); // 得到 "+02:00"
}
方法2:自定义querystring解析逻辑
const querystring = require('querystring');

const queryStr = req.url.split('?')[1];
if (queryStr) {
  const params = querystring.parse(queryStr, null, null, {
    decodeURIComponent: (str) => {
      // 先把+还原为%2B,再执行解码
      return decodeURIComponent(str.replace(/\+/g, '%2B'));
    }
  });
  const time_zone = params.time_zone; // 得到 "+02:00"
}

注意事项

优先选择方案一,因为它严格遵循URL编码规范,能避免后续出现其他参数解析异常的问题。方案二属于临时兼容手段,只在前端无法调整时使用。

内容的提问来源于stack exchange,提问作者Mohamed hamed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:55:20