Node.js在Windows上快速起步 (二) 如何获取 get/post/cookie的值和设置cookie
发布于 2年前 作者 nece001 2807 次浏览

一般的,如asp,php等这些语言,对请求的数据可以很方便的获得 asp: Request.QueryString(“name”) Request.Form(“name”) Request.Cookie(“name”) php: $_GET[‘name’]; $_POST[‘name’]; $_COOKIE[‘name’]; ,但Node.js里没有这么方便,这些东西得自己做,除非使用框架.

response的set-cookie的COOKIE的格式为每行一个: aaa=aaa bbb=bbb; expires=Fri, 19-Jul-2013 07:28:03 GMT; path=/ ccc=ccc; expires=Fri, 19-Jul-2013 07:28:03 GMT; path=/; domain=bbb.com ddd=ddd; expires=Fri, 19-Jul-2013 07:28:03 GMT; path=/; domain=ddd.com; secure eee=eee; expires=Fri, 19-Jul-2013 07:28:03 GMT; path=/; domain=eee.com; secure; httponly

上来就用框架我感觉不好,所以一边搜索,一边把代码写出来了,只是cookie部分有点多,不过我都加注释了

将下边的代码保存为gpc.js 然后进入到命令行: D:\node\test>node gpc.js

然后用浏览器输入:http://127.0.0.1:8888 就能看到结果了

如果想测试post,请自建一个页面放一个表单,代码如下:

<form method="post" action="http://127.0.0.1:8888/?foo=bar"> <input type="text" name="text"> <input type="submit"> </form>

下边是gpc.js的全部内容:

var port = '8888’; // 服务运行的端口号 var http = require(‘http’); // 引入HTTP服务模块 var url = require(‘url’); // 引入URL模块 var querystring = require(‘querystring’); // 引入querystring格式的字符串解析模块,用于解析post的数据

http.createServer(function(request, response){

// 如何获取URL中的查询参数 var oUrl = url.parse(request.url, true); // 解析当前URL //oUrl.query.foo 这样就可以得到 foo 的值了

// 如何获取cookie(将在下边的end事件中使用)
var cookies = {}; // 保存请求中所有的cookie数据,之后直接可以cookies.name获取cookie的值
var cookieString = request.headers.cookie; // 因为这里直接把cookie的字符串返回了,所以要方便用的话得处理一下

// 下边解析一下cookie字符串,保存到cookies对象中
var pairs = cookieString.split(/[;,] */);
for (var i =0; i < pairs.length; i++){
    var idx = pairs[i].indexOf('=');
    var key = pairs[i].substr(0, idx);
    var val = pairs[i].substr(++idx, pairs[i].length).trim();
    cookies[key] = val;
}

// 如何设置cookie(将在下边的end事件中使用)
var cookiesArr = []; // 保存添加的cookie数据,响应的时候一起传给客户端

// 这个函数用于设置cookie,跟其它语言的用法相同
// expires 超时时间,单位为秒
request.setCookie = function(name, value, expires, path, domain){
    var cookieSrt = '';
    cookieStr = name + '=' + value + ';';
    //cookie有效期时间
    if (expires != undefined) {
        expires = parseInt(expires);
        var today = new Date();
        var time = today.getTime() + expires * 1000;
        var newDate = new Date(time);
        var expiresDate = newDate.toGMTString(); //转换成 GMT 格式。
        cookieStr += 'expires=' +  expiresDate + ';';
    }
    //路径
    if (path != undefined) {
        cookieStr += 'path=' +  path + ';';
    }
    //域名
    if (domain != undefined) {
        cookieStr += 'domain=' +  domain + ';';
    }
    cookiesArr.push(cookieStr);
    return true;
};

// 如何获取客户端IP
var clientIp = request.connection.remoteAddress;


// 如何获取post数据
var postData = ''; // 用于存放post过来的数据
request.on('data', function(chunk){ // POST过来的数据可能会一部分一部分的到达,每次数据到达会触发一次data事件
    postData += chunk; // 把POST过来的数据收集起来
});


// 这个事件是等POST请求完毕后,调用一个函数开始处理
request.on('end', function(){
    var get = oUrl.query; // 这里得到一个对象,参数名就是键名
    var post = querystring.parse(postData); // 解析数据,生成对象

    // 如何设置cookie,这里设置的要到第二次刷新才能显示出来
    // 注意cookie要在页面内容输出之前设置
    request.setCookie('aaa', 'aaa111');
    request.setCookie('bbb', 'bbb222', 999);

    // 输出cookie
    response.setHeader("Set-Cookie", cookiesArr); // 不写这行,cookie会获得一个s_fid=SESSION_ID

    response.writeHeader(200, {'content-type':'text/html;charset=utf-8'});
    response.write('URL查询:'+oUrl.search+'<br>'); // 查询字符串
    response.write('URL查询参数foo的值:'+get.foo+'<br>'); // 取foo传过来的值
    response.write('POST数据:'+postData+'<br>'); // 完整的post数据
    response.write('POST数据text的值:'+post.text+'<br>'); // 取name=text的文本域的值
    response.write('COOKIE数据:'+cookieString+'<br>'); // cookie字符串
    response.write('COOKIE数据aaa的值:'+cookies.aaa+'<br>'); // 取cookie的aaa的值
    response.write('客户端IP:'+clientIp+'<br>'); // 客户端IP
    response.end();
});

}).listen(port); console.log('Server Start http://127.0.0.1:’+port);

3 回复

倒了,代码怎么这样…

算了,先这样吧,编辑不了它

Well done 但是我这边运行起来有些问题,我得看看怎么回事。。。

回到顶部