http 模块
所有后端动态语言要想运行起来,都得先搭建服务器。Node.js 搭建服务器需要用到一个原生的模块 http。
- 加载 http 模块
- 调用 http.createServer() 方法创建服务,方法接受一个回调函数,回调函数中有两个参数,第一个是请求体,第二个是响应体。
- 在回调函数中一定要使用 response.end() 方法,用于结束当前请求,不然当前请求会一直处在等待的状态。
- 调用 listen 监听一个端口。
//原生模块
var http = require('http');
http.createServer(function(reqeust, response){
response.end('Hello Node');
}).listen(8080);
参数接受 — GET
当以 GET 请求服务器的时候,服务器可以通过 request.mothod 来判断当前的请求方式并通过 request.url 来获取当前请求的参数。
var http = require('http');
var url = require('url');
http.createServer(function(req, res){
var params = url.parse(req.url, true).query;
res.end(params);
}).listen(3000);
参数接受 — POST
不同于 GET 请求,POST 请求不能通协 url 进行获取,这个时候就需要用到请求体的事件进行监听获取
var http = require('http');
var util = require('util');
var querystring = require('querystring');
http.createServer(function(req, res){
// 定义了一个post变量,用于暂存请求体的信息
var post = '';
// 通过req的data事件监听函数,每当接受到请求体的数据,就累加到post变量中
req.on('data', function(chunk){
post += chunk;
});
// 在end事件触发后,通过querystring.parse将post解析为真正的POST请求格式,然后向客户端返回。
req.on('end', function(){
post = querystring.parse(post);
res.end(util.inspect(post));
});
}).listen(3000);
url 模块
请求的 url 都是字符串类型,url 所包含的信息也比较多,比如有:协议、主机名、端口、路径、参数、锚点等,如果对字符串解析这些信息的话,会相对麻烦,因此,Node.js 的原生模块 url 模块便可轻松解决这一问题
字符串转对象
- 格式:url.parse(urlstring, boolean)
参数
- urlstring:字符串格式的 url
- boolean:在 url 中有参数,默认参数为字符串,如果此参数为 true,则会自动将参数转转对象
常用属性
- href: 解析前的完整原始 URL,协议名和主机名已转为小写
- protocol: 请求协议,小写
- host: url 主机名,包括端口信息,小写
- hostname: 主机名,小写
- port: 主机的端口号
- pathname: URL中路径,下面例子的 /one
- search: 查询对象,即:queryString,包括之前的问号“?”
- path: pathname 和 search的合集
- query: 查询字符串中的参数部分(问号后面部分字符串),或者使用 querystring.parse() 解析后返回的对象
- hash: 锚点部分(即:“#”及其后的部分)
var url = require('url');
//第二个参数为 true => {a: 'index', t: 'article', m: 'default'}
var urlObj = url.parse('http://www.dk-lan.com/one?a=index&t=article&m=default#dk', true);
//urlObj.query 为一个对象
console.log(urlObj);
//第二个参数为 false
urlObj = url.parse('http://www.dk-lan.com/one?a=index&t=article&m=default#dk', false);
//urlObj.query 为一个字符串 => ?a=index&t=article&m=default
console.log(urlObj);
对象转字符串
- 格式:url.format(urlObj)
参数 urlObj 在格式化的时候会做如下处理
- href: 会被忽略,不做处理
- protocol:无论末尾是否有冒号都会处理,协议包括 http, https, ftp, gopher, file 后缀是 :// (冒号-斜杠-斜杠)
- hostname:如果 host 属性没被定义,则会使用此属性
- port:如果 host 属性没被定义,则会使用此属性
- host:优先使用,将会替代 hostname 和port
- pathname:将会同样处理无论结尾是否有/ (斜杠)
- search:将会替代 query属性,无论前面是否有 ? (问号),都会同样的处理
- query:(object类型; 详细请看 querystring) 如果没有 search,将会使用此属性.
- hash:无论前面是否有# (井号, 锚点),都会同样处理
var url = require('url');
var urlObj = {
firstname: 'dk',
url: 'http://dk-lan.com',
lastname: 'tom',
passowrd: '123456'
}
var urlString = url.format(urlObj);
console.log(urlString);
url.resolve
当有多个 url 需要拼接处理的时候,可以用到 url.resolve
var url = require('url');
url.resolve('http://dk-lan.com/', '/one')// 'http://dk-lan.com/one'
querystring 查询(参数)模块
GET 请求时参数都来自 URL,而 URL 都是字符串格式,为了方便操作,可以把字符串格式的参数通过 querystring 转换格式
字符串转对象
var str = 'firstname=dk&url=http%3A%2F%2Fdk-lan.com&lastname=tom&passowrd=123456';
var param = querystring.parse(param);
//结果
//{firstname:"dk", url:"http://dk-lan.com", lastname: 'tom', passowrd: 123456};
对象转字符串
var querystring = require('querystring');
var obj = {firstname:"dk", url:"http://dk-lan.com", lastname: 'tom', passowrd: 123456};
//将对象转换成字符串
var param = querystring.stringify(obj);
//结果
//firstname=dk&url=http%3A%2F%2Fdk-lan.com&lastname=tom&passowrd=123456
文件模块 fs
出于安全因互,javascript 是不能操作本地文件,所以文件的处理都会放到服务端去处理。Node.js 作为一门后端动态语言,同样具备了操作文件的功能,这一操作需要用到 Node.js 的原生模块:fs。
读取文本 — 异步读取
var fs = require('fs');
// 异步读取
// 参数1:文件路径,
// 参数2:读取文件后的回调
fs.readFile('demoFile.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取: " + data.toString());
});
读取文本 — 同步读取
var fs = require('fs');
var data = fs.readFileSync('demoFile.txt');
console.log("同步读取: " + data.toString());
写入文本 — 覆盖写入
var fs = require('fs');
//每次写入文本都会覆盖之前的文本内容
fs.writeFile('input.txt', '抵制一切不利于中国和世界和平的动机!', function(err) {
if (err) {
return console.error(err);
}
console.log("数据写入成功!");
console.log("--------我是分割线-------------")
console.log("读取写入的数据!");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取文件数据: " + data.toString());
});
});
写入文本 — 追加写入
var fs = require('fs');
fs.appendFile('input.txt', '愿世界和平!', function (err) {
if (err) {
return console.error(err);
}
console.log("数据写入成功!");
console.log("--------我是分割线-------------")
console.log("读取写入的数据!");
fs.readFile('input.txt', function (err, data) {
if (err) {
return console.error(err);
}
console.log("异步读取文件数据: " + data.toString());
});
});
图片读取
图片读取不同于文本,因为文本读出来可以直接用 console.log() 打印,但图片则需要在浏览器中显示,所以需要先搭建 web 服务,然后把以字节方式读取的图片在浏览器中渲染。
- 图片读取是以字节的方式
- 图片在浏览器的渲染因为没有 img 标签,所以需要设置响应头为 image
var http = require('http');
var fs = require('fs');
var content = fs.readFileSync('001.jpg', "binary");
http.createServer(function(request, response){
response.writeHead(200, {'Content-Type': 'image/jpeg'});
response.write(content, "binary");
response.end();
}).listen(8888);
console.log('Server running at http://127.0.0.1:8888/');