NodeJS的QueryString的bug要怎么解决

NodeJS的QueryString的bug要怎么解决

我用了requestify,然后他用了QueryString来解析uri。 问题是这个解析器有一个bug。 我用他来请求百度的登录地址:

https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&class=login&tt=&logintype=dialogLogin&callback=biduapi

注意到参数中的?getapi了吗? 这个参数!!很重要所以说两边,他是?getapi后面没有=,也没有别的什么。 这是百度用来做router的。 然后在QueryString里面转一圈之后,直接变成了

path: ‘/v2/api/?getapi=&tpl=mn&apiver=v3&class=login&tt=&logintype=dialogLogin &callback=biduapi’,

注意,getapi= 这里毫无原因的多了一个=,然后一直404 。

求个解决方案,毕竟我不想对nodejs的库做太多的修改……不然移植起来太坑爹了。

PS: 我现在用的是在Request.js的line161后面加一句

query = query.replace("=&","&");

这样的暴力方法。。


6 回复

NodeJS的QueryString的Bug要怎么解决

问题描述

我在使用 requestify 库时,遇到了一个关于 QueryString 解析的问题。具体来说,requestify 使用 querystring 模块来解析 URL 查询字符串。然而,这个解析器存在一个 bug,导致查询字符串中某些参数被错误地处理。

例如,当我尝试请求百度的登录接口时,URL 中的一个关键参数 ?getapi 被错误地处理成了 getapi=,这导致整个请求路径变成 /v2/api/?getapi=&tpl=mn&apiver=v3&class=login&tt=&logintype=dialogLogin&callback=biduapi,从而导致 404 错误。

解决方案

为了解决这个问题,可以使用 qs 模块来替代默认的 querystring 模块。qs 模块是一个更强大、更灵活的查询字符串解析器,它能更好地处理复杂的查询字符串。

以下是具体的步骤:

  1. 安装 qs 模块

    npm install qs
    
  2. 修改请求代码: 将 querystring 替换为 qs,并使用 qs.stringify 方法来生成查询字符串。

const requestify = require('requestify');
const qs = require('qs');

// 示例URL
const url = 'https://passport.baidu.com/v2/api/';

// 示例参数
const params = {
    getapi: '', // 注意这里没有值
    tpl: 'mn',
    apiver: 'v3',
    class: 'login',
    tt: '',
    logintype: 'dialogLogin',
    callback: 'biduapi'
};

// 使用qs模块生成查询字符串
const queryString = qs.stringify(params, { encode: false });

// 构建完整的URL
const fullUrl = `${url}?${queryString}`;

// 发起请求
requestify.get(fullUrl)
    .then(response => {
        console.log(response.body);
    })
    .catch(error => {
        console.error(error);
    });

解释

  • qs.stringify:使用 qs 模块的 stringify 方法来生成查询字符串,并通过 encode: false 参数确保不进行额外的编码。
  • fullUrl:将生成的查询字符串拼接到基础 URL 上。
  • requestify.get:使用 requestify 发起 GET 请求。

这种方法不仅解决了 querystring 模块的 bug,还提供了更强大的查询字符串处理能力。此外,这种方式避免了直接修改库代码,使得代码更加可维护和易于移植。


这是在发送请求啊亲。。哪里来的req

?getapi 这个router是第一个参数,只对这个判断一下,别的放过

用request把,没这个问题。

这个不能算QueryString的bug吧,只能说百度的url太奇葩了

根据你的描述,问题在于querystring模块在处理某些特定的查询字符串时会添加多余的等号=,这导致请求路径不正确。你可以通过手动处理查询字符串的方式来避免这个问题。

以下是一个示例代码,展示了如何手动处理查询字符串,从而绕过querystring模块的这个Bug:

const url = require('url');

function buildUrl(baseUrl, params) {
    const parsedUrl = url.parse(baseUrl);
    let queryString = Object.keys(params)
        .map(key => key + '=' + params[key])
        .join('&');
    
    if (parsedUrl.query) {
        queryString = parsedUrl.query + '&' + queryString;
    }
    
    parsedUrl.search = '?' + queryString;
    return url.format(parsedUrl);
}

// 示例使用
const baseUrl = 'https://passport.baidu.com/v2/api/';
const params = {
    getapi: '',
    tpl: 'mn',
    apiver: 'v3',
    class: 'login',
    tt: '',
    logintype: 'dialogLogin',
    callback: 'biduapi'
};

const finalUrl = buildUrl(baseUrl, params);
console.log(finalUrl);

在这个例子中,我们使用url模块的手动拼接查询字符串的方式,确保查询字符串不会被querystring模块错误地处理。这样可以保证生成的URL是正确的,避免出现多余的等号=

希望这个方法能帮助你解决问题,而不需要对Node.js库进行过多的修改。

回到顶部