zoukankan      html  css  js  c++  java
  • 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!");
            })
        })
    })
  • 相关阅读:
    Android多屏幕适配
    android应用签名详解
    内部类与静态内部类详解
    SpringBoot整合Spring Retry实现重试机制
    行为型模式之模板方法模式
    行为型模式之操作复杂对象结构(访问者模式)
    行为型模式之算法的封装与切换(策略模式)
    行为型模式之处理对象的多种状态及其相互转换(状态模式)
    行为型模式之对象间的联动(观察者模式)
    行为型模式之撤销功能的实现(备忘录模式)
  • 原文地址:https://www.cnblogs.com/fqh123/p/11254134.html
Copyright © 2011-2022 走看看