Node.js在Windows上快速起步 (二) 如何获取 get/post/cookie的值和设置cookie

Node.js在Windows上快速起步 (二) 如何获取 get/post/cookie的值和设置cookie

一般的,如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+'&lt;br&gt;'); // 查询字符串
response.write('URL查询参数foo的值:'+get.foo+'&lt;br&gt;'); // 取foo传过来的值
response.write('POST数据:'+postData+'&lt;br&gt;'); // 完整的post数据
response.write('POST数据text的值:'+post.text+'&lt;br&gt;'); // 取name=text的文本域的值
response.write('COOKIE数据:'+cookieString+'&lt;br&gt;'); // cookie字符串
response.write('COOKIE数据aaa的值:'+cookies.aaa+'&lt;br&gt;'); // 取cookie的aaa的值
response.write('客户端IP:'+clientIp+'&lt;br&gt;'); // 客户端IP
response.end();

});

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


5 回复

Node.js 在 Windows 上快速起步 (二):如何获取 GET/POST/Cookie 的值和设置 Cookie

在 Node.js 中,获取和设置 HTTP 请求中的 GET 参数、POST 数据以及 Cookie 并不像 ASP 或 PHP 那样简单。Node.js 提供了底层的 API 来处理这些请求,需要开发者手动编写代码来实现这些功能。

获取 URL 查询参数

在 Node.js 中,我们可以使用 url 模块来解析 URL,并从中提取查询参数。例如:

const url = require('url');

http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url, true); // 第二个参数为 true 表示解析查询字符串为对象
    const queryParams = parsedUrl.query;

    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`Query Params: ${JSON.stringify(queryParams)}`);
}).listen(8888);

获取 POST 数据

POST 数据需要监听 data 事件来收集所有数据片段,然后在 end 事件中进行解析。可以使用 querystring 模块来解析 POST 数据:

const http = require('http');
const querystring = require('querystring');

http.createServer((req, res) => {
    let body = [];
    req.on('data', chunk => {
        body.push(chunk);
    }).on('end', () => {
        body = Buffer.concat(body).toString();
        const postParams = querystring.parse(body);

        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end(`Post Params: ${JSON.stringify(postParams)}`);
    });
}).listen(8888);

获取和设置 Cookie

Cookie 是通过 HTTP 头传递的,可以通过 request.headers.cookie 获取。同样,我们也可以通过设置响应头来发送 Cookie。

const http = require('http');
const url = require('url');

http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url, true);
    const queryParams = parsedUrl.query;

    let cookies = {};
    if (req.headers.cookie) {
        req.headers.cookie.split(';').forEach(cookie => {
            const [key, value] = cookie.trim().split('=');
            cookies[key] = decodeURIComponent(value);
        });
    }

    res.setHeader('Set-Cookie', [
        'aaa=aaa111; Path=/',
        'bbb=bbb222; Path=/; Expires=Fri, 19-Jul-2013 07:28:03 GMT'
    ]);

    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end(`Cookies: ${JSON.stringify(cookies)}`);
}).listen(8888);

示例代码

将上述代码整合到一个文件中,比如命名为 gpc.js

const http = require('http');
const url = require('url');
const querystring = require('querystring');

http.createServer((req, res) => {
    const parsedUrl = url.parse(req.url, true);
    const queryParams = parsedUrl.query;

    let body = [];
    req.on('data', chunk => {
        body.push(chunk);
    }).on('end', () => {
        body = Buffer.concat(body).toString();
        const postParams = querystring.parse(body);

        let cookies = {};
        if (req.headers.cookie) {
            req.headers.cookie.split(';').forEach(cookie => {
                const [key, value] = cookie.trim().split('=');
                cookies[key] = decodeURIComponent(value);
            });
        }

        res.setHeader('Set-Cookie', [
            'aaa=aaa111; Path=/',
            'bbb=bbb222; Path=/; Expires=Fri, 19-Jul-2013 07:28:03 GMT'
        ]);

        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.end(`
            Query Params: ${JSON.stringify(queryParams)}<br>
            Post Params: ${JSON.stringify(postParams)}<br>
            Cookies: ${JSON.stringify(cookies)}
        `);
    });
}).listen(8888, () => {
    console.log('Server running at http://127.0.0.1:8888/');
});

运行该脚本并访问 http://127.0.0.1:8888,你将能够看到从 URL 和 POST 请求中获取的参数以及 Cookie 的信息。


倒了,代码怎么这样…

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

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

以下是关于如何在Node.js中获取和设置GETPOSTCookie值的详细说明及示例代码。

获取GET参数

可以通过解析请求的URL来获取GET参数。例如:

var oUrl = url.parse(request.url, true);
var fooValue = oUrl.query.foo;

获取POST数据

POST数据需要监听data事件收集所有数据片段,并在end事件中进行解析:

var postData = '';

request.on('data', function(chunk) {
    postData += chunk;
});

request.on('end', function() {
    var post = querystring.parse(postData);
    var textValue = post.text;
});

获取Cookie

可以从请求头中获取Cookie字符串,然后解析为对象:

var cookies = {};
var cookieString = request.headers.cookie;

if (cookieString) {
    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

可以定义一个函数来设置Cookie:

request.setCookie = function(name, value, expires, path, domain) {
    var cookieStr = name + '=' + value + ';';

    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();
        cookieStr += 'expires=' + expiresDate + ';';
    }

    if (path != undefined) {
        cookieStr += 'path=' + path + ';';
    }

    if (domain != undefined) {
        cookieStr += 'domain=' + domain + ';';
    }

    cookiesArr.push(cookieStr);
};

示例代码

完整的gpc.js文件如下:

var port = '8888';
var http = require('http');
var url = require('url');
var querystring = require('querystring');

http.createServer(function(request, response) {
    var oUrl = url.parse(request.url, true);
    var fooValue = oUrl.query.foo;

    var cookies = {};
    var cookieString = request.headers.cookie;
    
    if (cookieString) {
        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;
        }
    }

    var cookiesArr = [];

    request.setCookie = function(name, value, expires, path, domain) {
        var cookieStr = name + '=' + value + ';';
        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();
            cookieStr += 'expires=' + expiresDate + ';';
        }
        if (path != undefined) {
            cookieStr += 'path=' + path + ';';
        }
        if (domain != undefined) {
            cookieStr += 'domain=' + domain + ';';
        }
        cookiesArr.push(cookieStr);
        return true;
    };

    var postData = '';
    request.on('data', function(chunk) {
        postData += chunk;
    });

    request.on('end', function() {
        var post = querystring.parse(postData);
        var textValue = post.text;

        request.setCookie('aaa', 'aaa111');
        request.setCookie('bbb', 'bbb222', 999);

        response.setHeader("Set-Cookie", cookiesArr);
        response.writeHead(200, {'Content-Type': 'text/html'});
        response.write('URL查询:' + oUrl.search + '<br>');
        response.write('URL查询参数foo的值:' + fooValue + '<br>');
        response.write('POST数据:' + postData + '<br>');
        response.write('POST数据text的值:' + textValue + '<br>');
        response.write('COOKIE数据:' + cookieString + '<br>');
        response.write('COOKIE数据aaa的值:' + cookies.aaa + '<br>');
        response.end();
    });
}).listen(port);
console.log('Server started on http://127.0.0.1:' + port);

这段代码展示了如何获取和设置GET、POST和Cookie的值。

回到顶部