3

http 模块

所有后端动态语言要想运行起来,都得先搭建服务器。Node.js 搭建服务器需要用到一个原生的模块 http。

  1. 加载 http 模块
  2. 调用 http.createServer() 方法创建服务,方法接受一个回调函数,回调函数中有两个参数,第一个是请求体,第二个是响应体。
  3. 在回调函数中一定要使用 response.end() 方法,用于结束当前请求,不然当前请求会一直处在等待的状态。
  4. 调用 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 服务,然后把以字节方式读取的图片在浏览器中渲染。

  1. 图片读取是以字节的方式
  2. 图片在浏览器的渲染因为没有 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/');

DK_Lan
340 声望253 粉丝

前端高级讲师,附上本人随堂视频:[链接]