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+'<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);
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中获取和设置GET
、POST
和Cookie
值的详细说明及示例代码。
获取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的值。