关于nodejs的基础知识点

NodeJs 的fs模块

fs是filesystem的缩写,该模块提供本地文件的读写能力,基本上是POSIX文件操作命令的简单包装

readFile(),readFileSync()

readFile方法用于异步读取数据

fs.readFile('./image.png', function (err, buffer) {
  if (err) throw err;
  process(buffer);
});

readFile方法的第一个参数是文件的路径,可以是绝对路径,也可以是相对路径。注意,如果是相对路径,是相对于当前进程所在的路径(process.cwd()),而不是相对于当前脚本所在的路径。

readFile方法的第二个参数是读取完成后的回调函数。该函数的第一个参数是发生错误时的错误对象,第二个参数是代表文件内容的Buffer实例。

readFileSync方法用于同步读取文件,返回一个字符串。

var text = fs.readFileSync(fileName, 'utf8');
 
// 将文件按行拆成数组
text.split(/\r?\n/).forEach(function (line) {
  // ...
});

readFileSync方法的第一个参数是文件路径,第二个参数可以是一个表示配置的对象,也可以是一个表示文本文件编码的字符串。默认的配置对象是{ encoding: null, flag: ‘r’ },即文件编码默认为null,读取模式默认为r(只读)。如果第二个参数不指定编码(encoding),readFileSync方法返回一个Buffer实例,否则返回的是一个字符串。

writeFile(),writeFileSync()

writeFile方法用于异步写入文件

fs.writeFile('message.txt', 'Hello Node.js', (err) => {
  if (err) throw err;
  console.log('It\'s saved!');
});

上面代码中,writeFile方法的第一个参数是写入的文件名,第二个参数是写入的字符串,第三个参数是回调函数。

回调函数前面,还可以再加一个参数,表示写入字符串的编码(默认是utf8)。

fs.writeFile('message.txt', 'Hello Node.js', 'utf8', callback);

writeFileSync方法用于同步写入文件

fs.writeFileSync(fileName, str, 'utf8');

它的第一个参数是文件路径,第二个参数是写入文件的字符串,第三个参数是文件编码,默认为utf8。

exists(path, callback)

exists方法用来判断给定路径是否存在,然后不管结果如何,都会调用回调函数。

fs.exists('/path/to/file', function (exists) {
  util.debug(exists ? "it's there" : "no file!");
});

上面代码表明,回调函数的参数是一个表示文件是否存在的布尔值。

需要注意的是,不要在open方法之前调用exists方法,open方法本身就能检查文件是否存在。

下面的例子是如果给定目录存在,就删除它。

if (fs.existsSync(outputFolder)) {
  console.log('Removing ' + outputFolder);
  fs.rmdirSync(outputFolder);
}

mkdir(),writeFile(),readFile()

mkdir方法用于新建目录。

var fs = require('fs');
 
fs.mkdir('./helloDir',0777, function (err) {
  if (err) throw err;
});

mkdir接受三个参数,第一个是目录名,第二个是权限值,第三个是回调函数。

writeFile方法用于写入文件。

var fs = require('fs');
 
fs.writeFile('./helloDir/message.txt', 'Hello Node', function (err) {
  if (err) throw err;
  console.log('文件写入成功');
});

readFile方法用于读取文件内容。

var fs = require('fs');
 
fs.readFile('./helloDir/message.txt','UTF-8' ,function (err, data) {
  if (err) throw err;
  console.log(data);
});

上面代码使用readFile方法读取文件。readFile方法的第一个参数是文件名,第二个参数是文件编码,第三个参数是回调函数。可用的文件编码包括“ascii”、“utf8”和“base64”。如果没有指定文件编码,返回的是原始的缓存二进制数据,这时需要调用buffer对象的toString方法,将其转为字符串。

var fs = require('fs');
fs.readFile('example_log.txt', function (err, logData) {
  if (err) throw err;
  var text = logData.toString();
});

readFile方法是异步操作,所以必须小心,不要同时发起多个readFile请求。

for(var i = 1; i <= 1000; i++) {
  fs.readFile('./'+i+'.txt', function() {
     // do something with the file
  });
}

上面代码会同时发起1000个readFile异步请求,很快就会耗尽系统资源。

mkdirSync(),writeFileSync(),readFileSync()

这三个方法是建立目录、写入文件、读取文件的同步版本。

fs.mkdirSync('./helloDirSync',0777);
fs.writeFileSync('./helloDirSync/message.txt', 'Hello Node');
var data = fs.readFileSync('./helloDirSync/message.txt','UTF-8');
console.log('file created with contents:');
console.log(data);

对于流量较大的服务器,最好还是采用异步操作,因为同步操作时,只有前一个操作结束,才会开始后一个操作,如果某个操作特别耗时(常常发生在读写数据时),会导致整个程序停顿。

readdir(),readdirSync()

readdir方法用于读取目录,返回一个所包含的文件和子目录的数组。

fs.readdir(process.cwd(), function (err, files) {
  if (err) {
    console.log(err);
    return;
  }
 
  var count = files.length;
  var results = {};
  files.forEach(function (filename) {
    fs.readFile(filename, function (data) {
      results[filename] = data;
      count--;
      if (count <= 0) {
        // 对所有文件进行处理
      }
    });
  });
});

readdirSync方法是readdir方法的同步版本。下面是同步列出目录内容的代码。

var files = fs.readdirSync(dir);
files.forEach(function (filename) {
  var fullname = path.join(dir,filename);
  var stats = fs.statSync(fullname);
  if (stats.isDirectory()) filename += '/';
  process.stdout.write(filename + '\t' +
    stats.size + '\t' +
    stats.mtime + '\n'
  );
});

stat()

stat方法的参数是一个文件或目录,它产生一个对象,该对象包含了该文件或目录的具体信息。我们往往通过该方法,判断正在处理的到底是一个文件,还是一个目录。

var fs = require('fs');
 
fs.readdir('/etc/', function (err, files) {
  if (err) throw err;
 
  files.forEach( function (file) {
    fs.stat('/etc/' + file, function (err, stats) {
      if (err) throw err;
 
      if (stats.isFile()) {
        console.log("%s is file", file);
      }
      else if (stats.isDirectory ()) {
      console.log("%s is a directory", file);
      }
    console.log('stats:  %s',JSON.stringify(stats));
    });
  });
});

watchfile(),unwatchfile()

watchfile方法监听一个文件,如果该文件发生变化,就会自动触发回调函数。

var fs = require('fs');
 
fs.watchFile('./testFile.txt', function (curr, prev) {
  console.log('the current mtime is: ' + curr.mtime);
  console.log('the previous mtime was: ' + prev.mtime);
});
 
fs.writeFile('./testFile.txt', "changed", function (err) {
  if (err) throw err;
 
  console.log("file write complete");   
});

unwatchfile方法用于解除对文件的监听。

createReadStream()

createReadStream方法往往用于打开大型的文本文件,创建一个读取操作的数据流。所谓大型文本文件,指的是文本文件的体积很大,读取操作的缓存装不下,只能分成几次发送,每次发送会触发一个data事件,发送结束会触发end事件。

var fs = require('fs');
 
function readLines(input, func) {
  var remaining = '';
 
  input.on('data', function(data) {
    remaining += data;
    var index = remaining.indexOf('\n');
    var last  = 0;
    while (index > -1) {
      var line = remaining.substring(last, index);
      last = index + 1;
      func(line);
      index = remaining.indexOf('\n', last);
    }
 
    remaining = remaining.substring(last);
  });
 
  input.on('end', function() {
    if (remaining.length > 0) {
      func(remaining);
    }
  });
}
 
function func(data) {
  console.log('Line: ' + data);
}
 
var input = fs.createReadStream('lines.txt');
readLines(input, func);

createWriteStream()

createWriteStream方法创建一个写入数据流对象,该对象的write方法用于写入数据,end方法用于结束写入操作。

var out = fs.createWriteStream(fileName, {
  encoding: 'utf8'
});
out.write(str);
out.end();

createWriteStream方法和createReadStream方法配合,可以实现拷贝大型文件。

function fileCopy(filename1, filename2, done) {
  var input = fs.createReadStream(filename1);
  var output = fs.createWriteStream(filename2);
 
  input.on('data', function(d) { output.write(d); });
  input.on('error', function(err) { throw err; });
  input.on('end', function() {
    output.end();
    if (done) done();
  });
}

NodeJs 里面的fs模块

Node.js 提供一组类似 UNIX(POSIX)标准的文件操作API。 Node 导入文件系统模块(fs)语法如下所示:

var fs = require("fs")

对文件的操作

文件读取

Node.js 文件系统(fs 模块)模块中的方法均有异步和同步版本,例如读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFileSync()。

异步的方法函数最后一个参数为回调函数,回调函数的第一个参数包含了错误信息(error)。

建议使用异步方法,比起同步,异步方法性能更高,速度更快,而且没有阻塞。

同步

//同步 所有同步的函数都是函数后面加Sync;
 var res = fs.writeFileSync("1.txt","我是写入内容");

异步

//文件的读取
fs.readFile("1.txt",function (err,data) {
     if (err){
        console.log(err)
     }else {
         console.log(data.toString())
     }
 })

文件写入

//创建: writeFile(文件名,写入内容,配置参数,回调函数) 异步
//配置参数:
/*
* a :追加
* w :写入
* r :读取
* */
fs.writeFile("2.txt","我是2.txt",{flag:"a"},function (err) {
    if(err){
        console.log(err);
    }else {
        console.log("写入成功");
    }
})
 
// 追加写入
fs.appendFile("2.txt","我是追加的字符",function (err) {
    if(err){
      return  console.log(err);
    }else {
        console.log("追加成功");
    }
})

文件名修改

//文件修改(文件名的修改) 
 fs.rename("5.txt","1.txt",function (err) {
     if(err){
         console.log(err)
     }else {
         console.log("修改成功");
     }
 })

文件名删除

//文件删除
 fs.unlink("2.txt",function (err) {
     if(err){
         return console.log(err)
     }else {
         console.log("删除成功")
     }
 })

对文件夹的操作

文件夹的操作/目录操作

// 目录创建:
// 1、1:执行-x 2、2:写-w 3、4:读-r
fs.mkdir("10",0666,function (err) {
    if(err){
        console.log(err)
    }else {
        console.log("创建成功");
    }
})

判断文件或者文件夹是否存在

fs.exists("10",function (exists) {
    if(exists){
        console.log("文件夹已存在");
    }else {
        fs.mkdir("10",0777,function (err) {
            if(err){
                return console.log(err);
            }else{
                console.log("创建成功");
            }
        })
    }
})

删除文件夹 : 只能删除空文件夹

fs.rmdir("10",function (err) {
    if(err){
        return console.log(err)
    }else {
        console.log("删除成功");
    }
})

读取文件夹

fs.readdir("10",function (err,data) {
    if(err){
        console.log(err);
    }else {
        console.log(data);
    }
})

显示文件的详细信息:

//针对详细信息来判断是否是文件
fs.stat("10",function (err,data) {
    if(err){
       return console.log(err)
    }else {
        // console.log(data);
        //判断是否是文件
        var res = data.isFile();
        //判断是否是文件夹
        // data.isDirectory();
        if(res){
            console.log("是文件")
        }else {
            console.log("是文件夹")
        }
    }
})

由于node.js中没有删除包含文件的文件夹的函数,因此我们仿写一个函数来删除包含文件的文件的函数

// 删除文件夹的函数 同步
var removeDir = function(src) {
   // 获取到文件夹里的内容
   var arr = fs.readdirSync(src);
   //判断是否是文件,如果是文件就删除;如果是文件夹再执行相同过程
    for(var i=0;i<arr.length;i++){
       //子文件的详细信息
       // 组装文件或者文件夹的路径
        var url = src+"/"+arr[i];
        var data = fs.statSync(url);
        //判断每个元素是文件或者是文件夹
        if(data.isFile()){
            //是文件
            fs.unlinkSync(url);
        }else {
            //是文件夹
            removeDir(url)
        }
    }
    //删除空文件夹
    fs.rmdirSync(src);
}

NodeJs 的path模块

获取 /路径/文件名/扩展名

  • 获取路径:path.dirname(filepath)
  • 获取文件名:path.basename(filename)
  • 获取扩展名:path.extname(filepath)

获取所在路径

const path=require("path");
var filepath='/node/base/path/test.js';
console.log(
    path.dirname(filepath)
)
//输出/node/base/path

获取文件名

path.basename(filepath)实际上是获取了路径的最后一部分,
而不是真正的获取到了文件名,但是在实际应用中最后的字符往往就是我们的文件名

const path = require("path");
console.log(path.basename("/node/base/path/test.js"));
//输出    test.js
console.log(path.basename("/node/base/path/test/"));
//输出    test
console.log(path.basename("/node/base/path/test"));
//输出    test

如果只想获取文件名,不需要扩展名则可以使用第二个参数,第二个参数就是指定的文件扩展名

const path = require("path");
console.log(path.basename("/node/base/path/test.js",".js"));
//输出    test

获取文件扩展名

const path = require("path");
console.log(path.extname("/node/base/path/test.js",".js"));
//输出    .js

更详细的规则是如下:(假设 path.basename(filepath) === B )

从B的最后一个.开始截取,直到最后一个字符。
如果B中不存在.,或者B的第一个字符就是.,那么返回空字符串。

案例

path.extname('index.html')
// Returns: '.html'

path.extname('index.coffee.md')
// Returns: '.md'

path.extname('index.')
// Returns: '.'

path.extname('index')
// Returns: ''

path.extname('.index')
// Returns: ''

文件路径分解/组合

  • path.join([…paths])
  • path.resolve([…paths])

path.join([…paths])

接收多个路劲字符串参数,把路径参数拼接起来然后再执行一下normalize

const path=require("path");
path.join("/temp",'node','/js/test.js')
//输出    \temp\node\js\test.js
path.join("/temp",'node','/js/test.js/','..')
//输出    \temp\node\js

path.resolve([…paths])

这个接口的作用就相当于在shell命令下,从左到右运行一遍cd path命令,
最终获取的绝对路径/文件名,就是这个接口所返回的结果了。

var path = require('path');

// 假设当前工作路径是 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('') )

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path
console.log( path.resolve('.') )

// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz') );

// 输出 /foo/bar/baz
console.log( path.resolve('/foo/bar', './baz/') );

// 输出 /tmp/file
console.log( path.resolve('/foo/bar', '/tmp/file/') );

// 输出 /Users/a/Documents/git-code/nodejs-learning-guide/examples/2016.11.08-node-path/www/js/mod.js
console.log( path.resolve('www', 'js/upload', '../mod.js') );

路径解析

path.normalize(filepath)

  • 如果路径为空,返回.,相当于当前的工作路径。
  • 将对路径中重复的路径分隔符(比如linux下的/)合并为一个。
  • 对路径中的. 、…进行处理。(类似于shell里的cd …)
  • 如果路径最后有/,那么保留该/。
var path = require('path');
var filepath = '/tmp/demo/js/test.js';

var index = 0;

var compare = function(desc, callback){
  console.log('[用例%d]:%s', ++index, desc);
  callback();
  console.log('\n');
};

compare('路径为空', function(){
  // 输出 .
  console.log( path.normalize('') );
});

compare('路径结尾是否带/', function(){
  // 输出 /tmp/demo/js/upload
  console.log( path.normalize('/tmp/demo/js/upload') );

  // /tmp/demo/js/upload/
  console.log( path.normalize('/tmp/demo/js/upload/') );
});

compare('重复的/', function(){
  // 输出 /tmp/demo/js
  console.log( path.normalize('/tmp/demo//js') );
});

compare('路径带..', function(){
  // 输出 /tmp/demo/js
  console.log( path.normalize('/tmp/demo/js/upload/..') );
});

compare('相对路径', function(){
  // 输出 demo/js/upload/
  console.log( path.normalize('./demo/js/upload/') );

  // 输出 demo/js/upload/
  console.log( path.normalize('demo/js/upload/') );
});

compare('不常用边界', function(){
  // 输出 ..
  console.log( path.normalize('./..') );

  // 输出 ..
  console.log( path.normalize('..') );

  // 输出 ../
  console.log( path.normalize('../') );

  // 输出 /
  console.log( path.normalize('/../') );

  // 输出 /
  console.log( path.normalize('/..') );
});

文件路径分解/组合

  • path.format(pathObject):将pathObject的root、dir、base、name、ext属性,按照一定的规则,组合成一个文件路径。
  • path.parse(filepath):path.format()方法的反向操作。

path.format(pathObject)

const path = require("path");
//root+base
var p1 = {
    root: "/temp/",
    base: "test.js"
}
path.format(p1)  //输出   /temp/test.js
//dir+name+ext
var p2 = {
    dir: "/temp",
    name: 'test',
    ext: '.js'
}
path.format(p2) //输出    /temp/test.js

path.parse(filepath)

path.format(pathObject) 的反向操作,也就是把一个路径转换为具有 root/dir/name/ext/base 等属性的对象

path.parse('/home/user/dir/file.txt')
// returns
// {
//    root : "/",
//    dir : "/home/user/dir",
//    base : "file.txt",
//    ext : ".txt",
//    name : "file"
// }

获取相对路径

接口:path.relative(from, to)

  • 如果from、to指向同个路径,那么,返回空字符串。
  • 如果from、to中任一者为空,那么,返回当前工作路径。
const path = require('path');

var p1 = path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb');
console.log(p1);  
// 输出 "../../impl/bbb"

var p2 = path.relative('/data/demo', '/data/demo');
console.log(p2);  
// 输出 ""

var p3 = path.relative('/data/demo', '');
console.log(p3);  
// 输出 ..\..\Study\Nodejs\mycode\path

NodeJs 的http模块

http 模块:封装了http server 和 client的功能,就是说可以充当server处理请求,也可以发出请求

  • http.createServer:创建server对象
  • http.get:执行http get请求
 const http = require('http')const server = http.createServer((req, res)=>{
     console.log(`url: ${req.url}  method: ${req.method}`)
  ​
      res.writeHead(200, {'Content-Type':'text/plain;charset=utf-8'})
      res.end('收到了请求')
      router(req, res)
  });
  // 执行get请求
  http.get("http://www.baidu.com", (res)=>{
      console.log(res);
      res.setEncoding('utf-8')
 
      let data = ''
      res.on('data', (chunk)=>{
          data += chunk
      })
      res.on('end', ()=>{
          console.log(data);
      })
  })

http.request(options,callback)

options是一个类似关联数组的对象,表示请求的参数,callback作为回调函数,需要传递一个参数,为http.ClientResponse的实例,http.request返回一个http.ClientRequest的实例。

options常用的参数有host、port(默认为80)、method(默认为GET)、path(请求的相对于根的路径,默认是“/”,其中querystring应该包含在其中,例如/search?query=byvoid)、headers(请求头内容)

var http=require("http");

var options={
    hostname:"cn.bing.com",
    port:80
}

var req=http.request(options,function(res){
    res.setEncoding("utf-8");
    res.on("data",function(chunk){
        console.log(chunk.toString())
    });
    console.log(res.statusCode);
});
req.on("error",function(err){
    console.log(err.message);
});
req.end();

http.get(options,callback)

这个方法是http.request方法的简化版,唯一的区别是http.get自动将请求方法设为了GET请求,同时不需要手动调用req.end(),但是需要记住的是,如果我们使用http.request方法时没有调用end方法,服务器将不会收到信息。因为http.get和http.request方法都是放回一个http.ClientRequest对象,所以我们来看一下这两个对象。

http.ClientRequest

http.ClientRequest是由http.request或者是http.get返回产生的对象,表示一个已经产生而且正在进行中的HTPP请求,提供一个response事件,也就是使用http.get和http.request方法中的回调函数所绑定的对象,可以显式地绑定这个事件的监听函数

var http=require("http");

var options={
    hostname:"cn.bing.com",
    port:80
}

var req=http.request(options);
req.on("response",function(res){
        res.setEncoding("utf-8");
    res.on("data",function(chunk){
        console.log(chunk.toString())
    });
    console.log(res.statusCode);
})

req.on("error",function(err){
    console.log(err.message);
});
req.end();

http.ClientRequest也提供了write和end函数,用于向服务器发送请求体,通常用于POST、PUT等操作,所有写操作都必须调用end函数来通知服务器,否则请求无效。此外,这个对象还提供了abort()、setTimeout()等方法

http.ClientReponse

与http.ServerRequest相似,提供了三个事件,data、end、close,分别在数据到达、传输结束和连接结束时触发,其中data事件传递一个参数chunk,表示接受到的数据。其属性如下
在这里插入图片描述
此外,这个对象提供了几个特殊的函数

  • response。setEncoding([encoding]):设置默认的编码,当data事件被触发时,数据将会以encoding编码,默认值是null,也就是不编码,以buffer形式存储
  • response.pause():暂停结束数据和发送事件,方便实现下载功能
  • response.resume():从暂停的状态中恢复

NodeJs 的Buffer模块

在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,Buffer类被引入作为NodejsAPI的一部分,使其可以在TCP流和文件系统操作等场景中处理二进制数据流。

因为Buffer在全局对象global上,因此无需通过require()引入,就可以直接使用。

实例化

let buf = new Buffer(5);
console.log(buf);//<Buffer 00 00 00 00 00>

新版本中使用Buffer.alloc(size[, fill[, encoding]])代替,来分配一个大小为 size 字节的新建的没有用0填充的Buffer,encoding为字符编码,默认为utf-8。

  • Buffer.alloc(size[, fill[, encoding]])
	let buf = Buffer.alloc(5);
	console.log(buf);//<Buffer 00 00 00 00 00>
  • Buffer.allocUnsafe(size)

以这种方式创建的 Buffer 实例的底层内存是未初始化的。 新创建的 Buffer 的内容是未知的,可能包含敏感数据。

	let buf = Buffer.allocUnsafe(5);
	console.log(buf);//<Buffer 48 2a 59 31 00>
  • Buffer.from(array),使用八位字节数组 array 分配一个新的 Buffer。
	let buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
	console.log(buf.toString());//buffer
  • Buffer.from(string[, encoding]),创建一个包含 string 的新 Buffer。 encoding 参数指定 string 的字符编码。
	let buf = Buffer.from('hello','utf8');
	console.log(buf);//<Buffer 68 65 6c 6c 6f>

功能方法

  • Buffer.byteLength(string[, encoding]),返回字符串的实际字节长度。
	let buf = Buffer.from("中国");
	console.log(Buffer.byteLength(buf));//6
  • Buffer.isEncoding(encoding),如果 encoding 是支持的字符编码,则返回 true,否则返回 false。
	console.log(Buffer.isEncoding('utf8'));//true
	console.log(Buffer.isEncoding('gbk'));//false
  • Buffer.isBuffer(obj),如果 obj 是一个 Buffer,则返回 true,否则返回 false。
	let buf = Buffer.from('hello');
	console.log(Buffer.isBuffer(buf));//true
	console.log(Buffer.isBuffer({}));//false
  • Buffer.concat(list[, totalLength]),返回一个合并了 list 中所有 Buffer 实例的新 Buffer。
	let buf1 = Buffer.alloc(3);
	let buf2 = Buffer.alloc(5);
	let buf3 = Buffer.concat([buf1,buf2]);
	console.log(Buffer.byteLength(buf3));//8

实例方法

  • buf.write(string[, offset[, length]][, encoding])

根据 encoding 指定的字符编码将 string 写入到 buf 中的 offset 位置。 length 参数是要写入的字节数。 如果 buf 没有足够的空间保存整个字符串,则只会写入 string 的一部分。 只编码了一部分的字符不会被写入。

	let buf = Buffer.alloc(5);
	buf.write("hello",2,3);
	console.log(buf);<Buffer 00 00 68 65 6c>
	console.log(buf.toString());//llo
  • buf.slice([start[, end]])

返回一个新的 Buffer,它引用与原始的 Buffer 相同的内存,但是由 start 和 end 索引进行偏移和裁剪。

	let buf = Buffer.from("hello");
	let res = buf.slice(2,4);
	console.log(res.toString());//ll
  • buf.toString([encoding[, start[, end]]])

根据 encoding 指定的字符编码将 buf 解码成字符串。 传入 start 和 end 可以只解码 buf 的子集。

	let buf = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
	console.log(buf.toString());//buffer
  • buf.toJSON()

返回 buf 的 JSON 格式。 当字符串化 Buffer 实例时,JSON.stringify() 会调用该函数。

	// toJSON方法不需要显式调用,当JSON.stringify方法调用的时候会自动调用toJSON方法
	let buf = Buffer.from("hello");
	let json = JSON.stringify(buf);
	console.log(json);//{"type":"Buffer","data":[104,101,108,108,111]}

NodeJs 的global全局对象

function global() {
    // 全局变量。__filename 表示当前正在执行的脚本的文件名。
    console.info('__filename: ' + __filename ); // __filename: D:\github\nodejs-test\requestHandlers.js

    // 全局变量。__dirname 表示当前执行脚本所在的目录。
    console.info('__dirname : ' + __dirname  ); // __dirname : D:\github\nodejs-test

    // 全局函数。setTimeout(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。setTimeout() 只执行一次指定函数。返回一个代表定时器的句柄值。
    setTimeout(function () {
        console.info('setTimeout: 我只执行一次。');
    }, 2000);

    // 全局函数。clearTimeout( t ) 全局函数用于停止一个之前通过 setTimeout() 创建的定时器。 参数 t 是通过 setTimeout() 函数创建的定时器。
    let t = setTimeout(function () {
        console.info('clearTimeout: 我没办法执行了。');
    }, 2000);
    clearTimeout(t); // 清除定时器

    // 全局函数。setInterval(cb, ms) 全局函数在指定的毫秒(ms)数后执行指定函数(cb)。
    let tt = setInterval(function () {
        console.info('setInterval: 我每2秒执行一次。');
    }, 2000);

    // 全局函数。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
    setTimeout(function () {
        clearInterval(tt); // 清除定时器
    }, 5000);

    // 全局对象。console
    console.info('console: 我也属于global。');

    // 全局变量。global 对象的属性。process
    console.info('process 当前目录: ' + process.cwd()); // 输出当前目录
    console.info('process 当前版本: ' + process.version); // 输出当前版本
    console.info('process 平台信息: ' + process.platform); // 输出平台信息
}

NodeJs 的exports全局对象

nodejs模块中的exports对象,你可以用它创建你的模块。

例如:(假设这是rocker.js文件)

function abc() {
  console.log("function abc.");
}
exports.test = abc;

在另一个文件中你这样引用:

var rocker = require('./rocker.js');
//在文件引入进来之后调用时记得不要遗漏()括号;
rocker.test(); // 'function abc.'

再看一个例子:

module.exports = function(name, age) {
    this.name = name;
    this.age = age;
    this.about = function() {
        console.log(this.name +' is '+ this.age +' years old');
    };
};

可以这样应用它:

var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old

下面例子中,你的模块是一个数组:

var Rocker = require('./rocker.js');
var r = new Rocker('Ozzy', 62);
r.about(); // Ozzy is 62 years old

可以这样应用它:

var rocker = require('./rocker.js');
console.log('Rockin in heaven: ' + rocker[2]); //Rockin in heaven: Ronnie James Dio

NodeJs 的querystring模块

querystring.stringify

将一个对象序列化为一个查询的字符串,中间使用 & 和 = 分别为字符串中的分隔符和赋值符

  • 简单的案例
 querystring.stringify({name:'pkcms',author:'zh',date:''})
//'name=pkcms&author=zh&date='
  • stringify 同样也能转换包含数组的JSON
   querystring.stringify({name:'pkcms',author:['zh','hhy'],date:''})
  //'name=pkcms&author=zh&author=hhy&date='
  • stringify 中的第2个参数是用来修改 & 分隔符为其他符号,如下示例的英文逗号
querystring.stringify({name:'pkcms',author:'zh',date:''},',')
//'name=pkcms,author=zh,date='
  • stringify 中不但能修改默认的 & 分隔符,也可以修改 = 赋值符,如下示例
querystring.stringify({name:'pkcms',author:'zh',date:''},',',':')
//'name:pkcms,author:zh,date:'

querystring.parse

将一个查询的字符串反序列化为一个对象,也就是说它与 querystring.stringify 是起相反作用的关系

  • 简单示例
querystring.parse('name=pkcms&author=zh&date=')
//{ name: 'pkcms', author: 'zh', date: '' }
  • 相同的参数名会反序列化为一个数组
querystring.parse('name=pkcms&author=zh&author=hhy&date=')
//{ name: 'pkcms', author: [ 'zh', 'hhy' ], date: '' }
  • 第2个参数是用来指明分隔符是用了哪个字符
querystring.parse('name=pkcms,author=zh,date=',',')
//{ name: 'pkcms', author: 'zh', date: '' }
  • 第3个参数是用来指明赋值符是用了hash字符
querystring.parse('name:pkcms,author:zh,date:',',',':')
//{ name: 'pkcms', author: 'zh', date: '' }

querystring.escape

将一个字符转义成一个编码

  querystring.escape('<哈哈>')
  //'%3C%E5%93%88%E5%93%88%3E'

querystring.usescape

将一个编码反转义成一个字符

  querystring.unescape('%3C%E5%93%88%E5%93%88%3E')
  //'<哈哈>'

猜你喜欢

转载自blog.csdn.net/weixin_47150940/article/details/107897999