拆分url参数node.js?

时间:2013-08-13 07:36:47

标签: node.js

我有以下网址参数

样本值实际值包含如此多的参数

var data = "browserName=MSIE&cookies=Rgn=%7CCode%3DMUMBAI%7Ctext%3DMumbai%7C; NREUM=s=1376355292394&r=220970&p=2080092;cs_uuid=209712058942163; cs_si=209712058942163.1&javascriptEnabled=true";

以下函数用于获取特定参数

//获取特定参数的通用函数

getParameterValue : function(data, parameter) {

    var value = null;
    if (data.length > 0) {
        var paramArray = data.split("&");

        for ( var i = 0; len = paramArray.length, i < len; i++) {
            var param = paramArray[i];
            var splitter = parameter + "=";
            if (param.indexOf(splitter) > -1) {
                value = param.substring(param.indexOf(splitter)
                        + splitter.length, param.length);
                break;
            }

        }
    }
    return value;

}

示例

 getParameterValue(data, "browserName");

 output is MSIE //correct

问题

getParameterValue(data, "cookies");

Output is

Rgn=%7CCode%3DMUMBAI%7Ctext%3DMumbai%7C; NREUM=s=1376355292394

但是必需的输出是

Rgn=%7CCode%3DMUMBAI%7Ctext%3DMumbai%7C; NREUM=s=1376355292394&r=220970&p=2080092;cs_uuid=209712058942163; cs_si=209712058942163.1

要知道:

1.URL参数在发送到节点服务器并解码时被编码(clientside)。

2.NREUM未编码,因此getParameterValue方法最多分割为1376355292394.

有助于改善getParameterValue功能。

准备解释更多。

1 个答案:

答案 0 :(得分:7)

好吧,getParameterValue()似乎确实正确解析了data,但data未正确编码以区分分隔符和值字符。

cookies的值,例如:

cookies=Rgn=%7CCode%3DMUMBAI%7Ctext%3DMumbai%7C; NREUM=s=1376355292394&r=220970&p=2080092;cs_uuid=209712058942163; cs_si=209712058942163.1

本身应编码(除了用于cookie值本身的任何编码之外)。

cookies=Rgn%3D%257CCode%253DMUMBAI%257Ctext%253DMumbai%257C%3B%20NREUM%3Ds%3D1376355292394%26r%3D220970%26p%3D2080092%3Bcs_uuid%3D209712058942163%3B%20cs_si%3D209712058942163.1

而且,由于模糊性,尝试“修复”这个服务器端已经很晚了。它需要在客户端进行编码,可以使用encodeURIComponent()进行编码。

'cookies=' + encodeURIComponent(cookies)

如果您正在使用jQuery,可以使用jQuery.param()来帮助确保正确编码。

var data = {
    browserName: 'MSIE',
    cookies: document.cookie,
    javascriptEnabled: true
};

data = $.param(data); // browserName=MSIE&cookies=Rgn%3D%257CCode...

或者,您可以使用轻量级娱乐,至少是“传统”格式。

function urlParam(params) {
    var res = [];

    for (var name in params) {
        res.push(encodeURIComponent(name) + '=' + encodeURIComponent(params[name]));
    }

    return res.join('&');
}

var data = urlParam(data);

示例:http://jsfiddle.net/GQpTB/


另外,您是否知道Node.js有querystring.parse()

// with: var qs = require('querystring');
var query = qs.parse(data);

console.log(query.cookies); // ...