nodejs基础,回调函数、模块、事件、文件读写、目录的创建与删除

node官网:http://nodejs.cn/

今天想看看node的视频,对node进一步了解,

1、我们可以从官网下载node到自己的电脑上,今天了解到node的真正概念,node时javascript在服务端的运行环境,虽然之前知道,但没有像今天一样这样的新体会,

javascript在服务端的运行环境??一般javascript是在浏览器运行的,浏览器就是javascript的一种运行环境,而node,可以让它在服务端运行,那么node环境中,有许多api,比如浏览器环境的全局对象是window,但在node环境中,全局对象是global

2、我现在用vscode来练习使用node,创建一个文件夹,用vscode打开,在这个目录下创建app.js,然后写上一些js代码,在控制台输入 node app或则node app.js 里面的js代码就会运行了

3、在node环境中 __dirname 代表的是当前目录(node中的一个全局变量) console.log出来看一下,会知道,它显示的是app.js所在的文件在电脑上的绝对路径

4、__filename :是当前文件的路径(c/xx/hello-nodejs/app.js)

5、回调函数的使用

function callFunction(fun){//回调函数的使用
    fun();
}

var sayBye=function(){
    console.log("bye");
}

callFunction(sayBye);

给回调函数传参

function callFunction(fun,name){//回调函传参
    fun(name);
}

var sayBye=function(name){
    console.log("bye"+name);
}

callFunction(sayBye,"名字");

给回调函数传参的另一种常用写法

function callFunction(fun,name){
    fun(name);
}

callFunction(function(name){//调用
    console.log("bye"+name);
},'名字');

6、require 以及 module.exports的使用(模块)

在node中,我们要分很多模块,那么怎样在一个模块中调用另一个模块呢?

加入我们要在app模块中调用count模块中的方法

count.js:

var counter = function(arr){
    return "there are " + arr.length +"elements in the array";
}

module.exports=counter;//暴露出来的内容

app.js:

var counter=require("./count");//引入count.js中暴露出来的内容,这里是一个函数

console.log(counter(["nodejs","vue","bootstrap"]));

然后运行node app 就会打印出想要的东西!!

如果想暴露多个东西呢?

count.js:

var counter = function(arr){
    return "there are " + arr.length +"elements in the array";
}

var adder = function(a,b){
    return `the sum of the 2 number is  ${a+b}`;
}

var pi=3.14;

module.exports.counter=counter;
module.exports.adder=adder;
module.exports.pi=pi;

app.js:

var stuff=require("./count");

console.log(stuff.counter(["nodejs","vue","bootstrap"]));
console.log(stuff.adder(2,3));
console.log(stuff.pi);

这样就可以暴露出多个东西

导出多种东西也有多种写法:

count.js:

module.exports={
    counter:counter,
    adder:adder,
    pi:pi
}

还可以这样写

count.js:

module.exports={//es6语法
    counter,
    adder,
    pi
}

还可以这样导出

count.js:

var adder = function(a,b){
    return `the sum of the 2 number is  ${a+b}`;
}

var pi=3.14;

module.exports={
    counter:function(arr){
        return "there are " + arr.length +"elements in the array";
    },
    adder,
    pi
}

在app调用时,也有多种写法:(反正导出的是一个对象)

console.log(require("./count").pi);

7、事件 events

node中的事件,有点像jquery中的事件,node中的事件是自定义的,先引入events核心库,创建一个事件对象,绑定上事件名,和事件的回调函数,然后出发

var events=require('events');//events是一个核心库

var myEmitter = new events.EventEmitter();//创建一个事件对象

myEmitter.on('someEvent',function(message){//给事件对象绑定一个事件名,并且绑定上一个回调函数
    console.log(message);
})

myEmitter.emit('someEvent','the event was emitted');//触发事件

下面来看一个应用实例:

var events=require('events');//events是一个核心库
var util=require('util');//引入工具库 (也是一个核心库)


var Person=function(name){//创建一个类
    this.name=name;
}

util.inherits(Person,events.EventEmitter);//让Person 继承这个类

var xiaoming=new Person('xiaoming');//创建3个Person 实例
var lili=new Person('lili');
var lucy=new Person('lucy');

var personArr=[xiaoming,lili,lucy];//创建一个数组,把三个实例放进去

personArr.forEach(function(person){//给每个实例 绑定一个speak事件
    person.on('speak',function(message){
        console.log(person.name+'said:'+message);
    })
});

xiaoming.emit('speak','Hi');//触发各自的事件
lili.emit('speak','i want a curry');
lucy.emit('speak','chi xi gua');

8、读写文件 fs

同步读写:

var fs = require('fs');//引入文件库(核心库)

//读取文件内容(同步)
var readMe = fs.readFileSync("readMe.txt","utf8");//第一个参数是 文件路径 这里实在跟目录  直接写文件名就行  第二个参数是编码格式
//写入文件内容,没有此文件将会创建这样的文件(同步),如果writeMe.txt之前有内容,之前的内容则会被覆盖
fs.writeFileSync("writeMe.txt",readMe);

同步读写就是按照代码顺序执行,文件读写不完,下面的代码就不会执行;

下面面来看一个异步的读取:

var fs = require('fs');//引入文件库(核心库)

//读取文件内容(异步)
var readMe = fs.readFile("readMe.txt","utf8",function(err,data){
    fs.writeFile('writeMe.txt',data,function(){//异步写入
        console.log("writeMe has finished");
    })
});
console.log("finished");

当我们运行node app时,发现finished会先于读写的回调打印出来,这证明读写文件是异步的。注:node是多线程的,但node执行javascript时,是单线程的。

9、删除文件fs .unlink

var fs = require('fs');//引入文件库(核心库)

fs.unlink('writeMe.txt',function(){//参数是文件路径和回调函数
    console.log('delete writeMe.txt file');
})

删除文件是一个异步的过程,同样,加上sync就是同步的 (unlinkSync)

10、先创建一个文件,再删除(这里创建文件是用的写入文件的方法)

var fs = require('fs');//引入文件库(核心库)

//这里是同步写入文件  其实我本意是 创建一个文件
fs.writeFileSync('stuff.txt','');//注意同步没有回调函数
// 删除刚刚创建的文件
fs.unlinkSync('stuff.txt');//注意同步没有回调函数

11、创建文件目录 fs.mkdirSync(对应的有异步方法)

var fs = require('fs');//引入文件库(核心库)

fs.mkdirSync('stuff');//创建文件(这里是同步的,因为有Sync)

12、先创建一个文件目录,再删除(fs.rmdirSync)

var fs = require('fs');//引入文件库(核心库)

fs.mkdirSync('stuff');//创建文件(这里是同步的,因为有Sync)

fs.rmdirSync('stuff');

13、先创建一个目录,再在此目录中写入一个文件,(这里都采用同步的方法)

var fs = require('fs');//引入文件库(核心库)

fs.mkdirSync("./stuff");
fs.writeFileSync("./stuff/aa.txt","");

14、先创建一个目录,再在目录里写一个文件,然后,删除该目录里的这个 文件,然后再删除这个目录(同步)

var fs = require('fs');//引入文件库(核心库)

fs.mkdirSync("./stuff");
fs.writeFileSync("./stuff/aa.txt","");
fs.unlinkSync("./stuff/aa.txt");
fs.rmdirSync("./stuff");

15、将一个文件复制到新创建的目录中,这里都采用异步的

var fs = require('fs');//引入文件库(核心库)

fs.mkdir("./stuff",function(){
    fs.readFile("readMe.txt","utf8",function(err,data){
        fs.writeFile("./stuff/writeMe.txt",data,function(){
            console.log("write file success!");
        })
    })
})